Java 为什么sunjvm在堆等大小稳定的情况下仍继续消耗越来越多的RSS内存?
在过去的一年中,我在我的应用程序的Java堆使用方面做了巨大的改进——减少了66%。为了实现这一点,我一直在通过SNMP监控各种指标,例如Java堆大小、cpu、Java非堆等 最近,我一直在监视JVM有多少实际内存(RSS,常驻集),我有点惊讶。JVM消耗的实际内存似乎完全独立于我的应用程序堆大小、非堆、eden空间、线程数等 由Java SNMP测量的堆大小 实际内存(KB)。(例如:1MB的KB=1GB) (堆图中的三个凹陷对应于应用程序更新/重新启动。) 这对我来说是个问题,因为JVM消耗的所有额外内存都是“窃取”操作系统用于文件缓存的内存。事实上,一旦RSS值达到~2.5-3GB,我就开始看到我的应用程序的响应时间变慢,CPU利用率提高,主要是IO等待。随着交换分区分页的开始。这都是非常不可取的 那么,我的问题是:Java 为什么sunjvm在堆等大小稳定的情况下仍继续消耗越来越多的RSS内存?,java,memory,jvm,sun,performance,Java,Memory,Jvm,Sun,Performance,在过去的一年中,我在我的应用程序的Java堆使用方面做了巨大的改进——减少了66%。为了实现这一点,我一直在通过SNMP监控各种指标,例如Java堆大小、cpu、Java非堆等 最近,我一直在监视JVM有多少实际内存(RSS,常驻集),我有点惊讶。JVM消耗的实际内存似乎完全独立于我的应用程序堆大小、非堆、eden空间、线程数等 由Java SNMP测量的堆大小 实际内存(KB)。(例如:1MB的KB=1GB) (堆图中的三个凹陷对应于应用程序更新/重新启动。) 这对我来说是个问题,因为JV
- 为什么会发生这种情况?“引擎盖下”发生了什么事?
- 如何控制JVM的实际内存消耗?
- RHEL4 64位(Linux-2.6.9-78.0.5.ELsmp#1 SMP Wed Sep 24…2008 x86_64…GNU/Linux)
- Java 6(构建1.6.0_07-b06)
- 雄猫6
- 应用程序(按需HTTP视频流)
- 通过java.nio文件通道实现高I/O
- 数百到数千个线程
- 数据库使用率低
- 春天,冬眠
-Xms128m
-Xmx640m
-XX:+UseConcMarkSweepGC
-XX:+AlwaysActAsServerClassMachine
-XX:+CMSIncrementalMode
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+CMSLoopWarn
-XX:+HeapDumpOnOutOfMemoryError
我如何衡量RSS:
ps x -o command,rss | grep java | grep latest | cut -b 17-
这将进入一个文本文件,并定期读取到监控系统的RRD数据库中。请注意,ps输出千字节
问题与解决方案: 虽然最终证明是的答案最终是正确的,但是通过使用
pmap
引导我找到了正确的诊断路径。(去投票支持他们的两个答案!)下面是发生的事情:
我肯定知道的事情:
java.nio
的文件访问后端。此后端将mappedbytebuffer
映射到文件本身MappedByteBuffer.force()
pmap
列出:
MappedByteBuffer.force()
移动到数据库更新事件,而不是定期计时器。这个问题会神奇地消失吗- 使用
,JVM内部发生了什么?如果没有任何更改,它是否仍然写入整个文件?档案的一部分?它是先装的吗MappedByteBuffer.force()
- RSS中是否始终存在一定数量的MBB?(RSS大约是总分配MBB大小的一半。巧合?我怀疑不是。)
- 如果我将
移动到数据库更新事件,而不是定期计时器,问题会神奇地消失吗MappedByteBuffer.force()
- 为什么RSS坡度如此规则?它与任何应用程序负载度量都不相关
ps -p 7429 -o pcpu,cutime,cstime,cmin_flt,cmaj_flt,rss,size,vsize
[stu@server ~]$ ps -p 12720 -o pcpu,cutime,cstime,cmin_flt,cmaj_flt,rss,size,vsize
%CPU - - - - RSS SZ VSZ
28.8 - - - - 3262316 1333832 8725584