免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3700 | 回复: 4
打印 上一主题 下一主题

请教java开发高手一个线程 进程 内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-04 20:37 |只看该作者 |倒序浏览
环境:16G内存 8核处理器
JVM配置:堆大小4G 并行回收
JDK版本:32位 1.5
系统版本:linux 64位
web应用:tomcat
程序特点:编译图片和flash
tomcat线程池配置:
  1. <Connector port="8080" maxHttpHeaderSize="8192"
  2.                maxThreads="1000" minSpareThreads="100" maxSpareThreads="150"
  3.                enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"
  4.                connectionTimeout="30000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
复制代码
情况:
压力测试一段时间后通过jvisualvm观察 程序jVM回收正常
通过top观察,java进程消耗的内存一直增长直到系统内存溢出 ,(data)17G左右的时候 系统会自动杀掉 java进程
再此之前jvm的堆内存还在健康回收,保持4G上限不变。而且tomcat日志中并未出现OOM的信息

问题:
1.java整个进程会过多申请系统内存(17-4)G是什么导致的
2.通过对运行中线程的观察 发现虽然开启了多个处理线程但是实际running的一直是20个processor(压力测试并发是20个线程)
其余80个线程一直是waitting状态,理解是不是因为20个processor一直没有释放所以导致java进程内存一直增长
如果在程序中增加每个处理请求后sleep 1或者关闭线程会好些【本人从未搞过开发,纯属假想】

论坛徽章:
0
2 [报告]
发表于 2010-06-06 08:19 |只看该作者
1.我觉得跟你的网站的逻辑代码有关系。
2.这个基本上不是你控制的。还是仔细分析一下你的代码中是否有内存问题吧。

另:64位的系统上是可以用64的JVM的,如果换一下,是不是会更好?

论坛徽章:
0
3 [报告]
发表于 2010-06-07 12:37 |只看该作者
1.我觉得跟你的网站的逻辑代码有关系。
2.这个基本上不是你控制的。还是仔细分析一下你的代码中是否有内存 ...
friendmine 发表于 2010-06-06 08:19



    谢谢楼主回复,不过还是有些不明白
多出来的 7-8G内存是被谁拿走了呢
JVM本身的内存回收和使用范围都是正常的

论坛徽章:
0
4 [报告]
发表于 2010-06-07 15:15 |只看该作者
这个问题有了一定程度进展。
Java所谓的内存溢出其实可以分为内部溢出和外部溢出。
而网文一般都针对内部溢出(GC回收)做了详述
往往忽略了外部溢出
什么是外部溢出?
jvm是不会对非java语言申请的内存做回收的,而程序员在code的时候如果使用了类似JNI的本地调而且
处理不当就可能造成 java外的内存溢出。不知道说的对不对~~

论坛徽章:
0
5 [报告]
发表于 2010-06-08 12:32 |只看该作者
linux 系统有这种特性吧,启动后会把大量内存占用,当有其它应用申请时会划分出一部分给应用使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP