2
  1. 我有一个 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库;

  2. 每天运行 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?

关系信息:Linux下Java的虚拟内存使用情况,使用的内存过多

4

1 回答 1

2

我建议您查看 pmap 的过程。这将为您提供本机内存使用情况的细分。你无法控制的记忆是

  • 线程使用的总堆栈空间。
  • 内存映射文件的大小
  • 共享库的大小。
  • 本机库内存使用情况。例如套接字缓冲区(如果你有足够的套接字)

这些的一些组合正在使用差异。

于 2013-08-27T07:56:33.807 回答