我有一个 java(1.6 u25) 进程在 linux(centos 6.3 x64) 上运行 JAVA_OPTS="-server -Xms128M -Xmx256M -Xss256K -XX:PermSize=32M -XX:MaxPermSize=32M -XX:MaxDirectMemorySize=128M -XX: +UseAdaptiveSizePolicy -XX:MaxDirectMemorySize=128M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:GCTimeRatio=39 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log",java应用使用thrift 0.8.0库;
每天运行 TOP 命令,java 进程的 RES 值会不断增加(从 80MB 到 1.2GB(启动应用一个月后)),但是看到 jvm heap size 保持在 100 到 200MB 左右,并且看到 GC log 大约 1~每分钟 2 次 PSyoungGC,每天 1~2 次 PSOld GC,无内存泄漏。
那么,为什么java进程使用mem会不断增加,大大超过JVM设置呢?我认为java进程真正使用的mem将等于Xmx256M + MaxPermSize32M + MaxDirectMemorySize128M + JVM self used mem = 大约416MB?