[讨论] JVM进程占用的物理内存大小能超过参数限制的上限吗?

michael9527 2012-05-28
情况很简单:
一个虚拟机(hotstop 1.6.27)上跑了一个应用,仅此这一个应用,一个使用了spring,c3p等框架的应用。

虚拟机参数设置了最大堆内存是256M,其他都是默认值
某天观察发现这个jvm进程占用了物理内存到了25%多(整个机器物理内存是12G,centos,64位)

持久带和本地内存大小都没有设置,用的都是默认值,这样加起来应该不会到不1G的,可以top出来的结果占用却远超过1G。

不明白这么大的内存是怎么弄出来的?

michael9527 2012-05-28
好像用发射调用Unsafe也不会突破限制的,接受的是一个long的参数,但好像传入的值过大,就会报一个非法参数异常。

另外我用调用
jinfo -flag MaxDirectMemorySize 20974
结果却把线程堆栈信息打出来了
fxrz12 2012-05-29
这个应该不会,至少我是没遇到,有两方面的配置,一个是jvm内存的配置,另一个是容器内存的配置,虽然我并不是很明白两者间的关系如何,但根据长久对容器内存消耗的监测来看,是不会超过的,有几次超出容器的配置大小出现了系统崩溃,还有就是jvm和容器内存配置是一样的,仅此而已!希望有所帮助。
michael9527 2012-05-29
是啊,jvm堆内存,perm内存如果超出了都会OOM,本地内存我用反射试了也不会超过,那会不会是误报呢?我是用top命令查看的。
iwhp 2012-06-14
java 虚拟机是c写的,本身需要占用内存,若出现bug,可能有这种情况。
hudepin 2012-06-27
不知道是怎么出来了,应该oom了吧
coreymylive 2012-06-28
有direct 内存的。不属于JVM堆管理。
Global site tag (gtag.js) - Google Analytics