[讨论] jvm启动参数占用的内存其他程序还可以使用吗?
richard_2010
2013-01-13
我们服务器jvm启动cache住了4g的内存,在服务器上面用free看内存使用情况的时候会发现可用的只有1g多,buffer大概几百m,cached的是4g左右
前几天因为我们服务器线程池配置错误,导致服务器live的线程达到了3w多个,这样当有新的请求过来的时候报了oom,说是内存不足不能分配栈的空间,此时cpu占用大概为50%,而内存占用只有60%,还有40%就是被jvm cache的内存,看了gc日志也是正常,只有一些mini gc,基本没有full gc,旧生代基本是空的。。。 其他人说linux系统可用的内存应该是free+buffer+cache的内存,网上查的一些资料貌似也是这样说的,所以我很奇怪为什么会报oom? |
|
xiaoyu
2013-01-14
richard_2010 写道 我们服务器jvm启动cache住了4g的内存,在服务器上面用free看内存使用情况的时候会发现可用的只有1g多,buffer大概几百m,cached的是4g左右
前几天因为我们服务器线程池配置错误,导致服务器live的线程达到了3w多个,这样当有新的请求过来的时候报了oom,说是内存不足不能分配栈的空间,此时cpu占用大概为50%,而内存占用只有60%,还有40%就是被jvm cache的内存,看了gc日志也是正常,只有一些mini gc,基本没有full gc,旧生代基本是空的。。。 其他人说linux系统可用的内存应该是free+buffer+cache的内存,网上查的一些资料貌似也是这样说的,所以我很奇怪为什么会报oom? 机器的物理内存有多大?是32bit系统还是64bit? JVM 是32的还是64的? 贴出来 cat /proce/meminfo |
|
richard_2010
2013-01-14
64位的机器
http://www.cnblogs.com/balaamwe/archive/2011/12/07/2279305.html 这里有一篇别人的文章,里面有些测试数据,不断的生成新的线程,耗尽本机内存,但是堆内存并未耗尽,会报错:java.lang.OutOfMemoryError: unable to create new native thread 应该意味着jvm启动时会一次性把-Xmx和-XX:MaxPermSize参数指定的内存大小都分配过来,但是不会显示已使用,在linux系统中用top看到的jvm进程占用的内存大小为实际已使用的大小,已分配但未使用的内存在cached中 |
|
xiaoyu
2013-01-14
richard_2010 写道 64位的机器
http://www.cnblogs.com/balaamwe/archive/2011/12/07/2279305.html 这里有一篇别人的文章,里面有些测试数据,不断的生成新的线程,耗尽本机内存,但是堆内存并未耗尽,会报错:java.lang.OutOfMemoryError: unable to create new native thread 应该意味着jvm启动时会一次性把-Xmx和-XX:MaxPermSize参数指定的内存大小都分配过来,但是不会显示已使用,在linux系统中用top看到的jvm进程占用的内存大小为实际已使用的大小,已分配但未使用的内存在cached中 首先是栈使用的堆外内存,默认是一个线程1m(linux中), 另外你的机器是64bit的, 你也要看看你的jvm是不是64bit的。 如果是32bit的也只能用到4g。 |
|
richard_2010
2013-01-14
jvm也是64位的
话说32位的jvm也用不到4g的好吧。。。 |
|
xiaoyu
2013-01-14
richard_2010 写道 jvm也是64位的
话说32位的jvm也用不到4g的好吧。。。 嗯也是, 一般只能3G。 要是你服务器有多余的内存应该不会出现这个问题。 |