java - -XX:MaxPermSize 设置未反映
问题描述
我在 Linux 服务器上的应用程序中使用以下 JVM opts
-server -Xms3g -Xmx3g -Xmn512m -XX:MaxPermSize=256m -Xss256k -Xloggc:${gc_log_file}
-verbose:gc -XX:+DoEscapeAnalysis -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC
-XX:TargetSurvivorRatio=80
-Dsun.rmi.dgc.server.gcInterval=300000 -Dsun.rmi.dgc.client.gcInterval=300000
-XX:+AggressiveOpts
-XX:+PrintTenuringDistribution -XX:+PrintConcurrentLocks -XX:MaxTenuringThreshold=20
但是此设置在该节点上无效,并且 MaxPermSize 被视为140m而不是256m
细节:
MemTotal: 5925728 kB
java version "1.7.0_251"
堆
PSYoungGen total 471040K, used 122995K [0x00000007e0000000, 0x0000000800000000, 0x0000000800000000)
eden space 416256K, 25% used [0x00000007e0000000,0x00000007e6784d38,0x00000007f9680000)
from space 54784K, 31% used [0x00000007fca80000,0x00000007fdb18000,0x0000000800000000)
to space 53248K, 0% used [0x00000007f9680000,0x00000007f9680000,0x00000007fca80000)
ParOldGen total 2621440K, used 1146547K [0x0000000740000000, 0x00000007e0000000, 0x00000007e0000000)
object space 2621440K, 43% used [0x0000000740000000,0x0000000785face28,0x00000007e0000000)
PSPermGen total 140800K, used 140471K [0x0000000730000000, 0x0000000738980000, 0x0000000740000000)
object space 140800K, 99% used [0x0000000730000000,0x000000073892de90,0x0000000738980000)
根据 gclog 声明,PermGen 在达到 140m 时达到 99%
对象空间 140800K,已使用 99%
如何强制 Java 进程考虑 MaxPermSize VM 选择 PermGen?
解决方案
PSPermGen total 140800K, used 140471K
object space 140800K, 99% used
140800K
是分配的永久代,而不是可分配的最大值。
我没有 PermGen OOM,因为当应用程序达到 99% 时我正在杀死我的应用程序
如果你不杀死它,你会看到永久代不断增长以适应新的分配。
推荐阅读
- javascript - 我需要这个函数返回这个数组之间的“差异”
- javascript - 无法使用 JS 变量访问带有“:”的 GeoJSON 属性
- angular - 名称只能包含 URL 友好字符 NPM 安装
- java - HotSpot JVM 在哪里存储解释的字节码?
- powershell - 在 xml 生成 PowerShell 脚本中实现跟踪
- c++ - 为什么我的计数器应该为 0 时不能正常工作,但其他值 >0 工作正常?
- android - kotlin 中 val 的动态延迟初始化
- python - eBay API 返回 errorID 2000,服务操作 GetItem 未知
- sql-server - 加入未返回正确结果
- html - 第 N 个子选择器不适用于 CSS Grid 中的背景