如何在-XX:+ PrintFlagsFinal不支持时找到默认的MaxPermSize?

时间:2014-11-20 13:38:09

标签: jvm-arguments jvm-hotspot

我正在使用一个系统,可以同时启动许多作为Java应用程序实现的作业。每个作业都在一个单独的JVM中运行。

其中一些工作需要比其他工作更大的permgen。但是,由于操作系统内存有限,因此不允许所有作业使用最大值。

因此,我想为每项工作指定-XX:MaxPermSize。目前,作业运行时没有任何-XX:MaxPermSize参数,因此它们必须使用默认值。但是如何找出默认值是什么?

我见过Default values for Xmx, Xms, MaxPermSize on non-server-class machines,其中接受的答案是运行 java -XX:+PrintFlagsFinal ,它应输出默认值。但是,运行的JVM版本不支持该参数无法识别的VM选项' + PrintFlagsFinal' )。目前不支持更新到更新的JVM。

那么我找到默认值的选择是什么?
系统信息:

> java -version
Java(TM) SE Runtime Environment (build 1.6.0_14-b08) 
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

> cat /etc/issue
Welcome to SUSE Linux Enterprise Server 11 SP2  (x86_64) - Kernel \r (\l).

> uname -r
3.0.101-0.7.17-default

1 个答案:

答案 0 :(得分:1)

各个地区的默认值取决于:

  • 正在使用收集器(如果您使用CLI args明确指定它,则将依赖于Java版本。)
  • 您使用CLI args指定的堆大小等。 GC会根据某些比例分配空间。
  • 在机器上安装(或可能是可用的)RAM。

如何找到:

  • 从GC日志文件(-Xloggc:gc.log),我预计至少在完整GC日志中,GC会报告Perm Gen大小。见底部的例子。你可以拿一个代表性的gc日志文件,从中找到最大的perm gen大小,然后根据它来决定。
  • 其他参数如PrintFlagsFinal等(特定于Java版本)

我将查看1.6选项以查看是否可以找到某些内容并更新帖子,否则是时候升级了。 : - )

以下是来自不同GC的3个示例(Metaspace,CMS Perm& PSPermGen是您正在寻找的):

2014-11-14T08:43:53.197-0500: 782.973: [Full GC (Ergonomics) [PSYoungGen: 54477K->0K(917504K)] [ParOldGen: 1042738K->367416K(1048576K)] 1097216K->367416K(1966080K), [Metaspace: 46416K->46389K(1091584K)], 0.4689827 secs] [Times: user=3.52 sys=0.07, real=0.47 secs]
2014-10-29T06:14:56.491-0400: 6.754: [Full GC2014-10-29T06:14:56.491-0400: 6.754: [CMS: 96098K->113997K(5242880K), 0.7076870 secs] 735545K->113997K(6186624K), [CMS Perm : 13505K->13500K(51200K)], 0.7078280 secs] [Times: user=0.69 sys=0.01, real=0.71 secs] 
2014-10-29T21:13:33.140-0500: 2644.411: [Full GC [PSYoungGen: 2379K->0K(695296K)] [ParOldGen: 1397977K->665667K(1398272K)] 1400357K->665667K(2093568K) [PSPermGen: 106995K->106326K(262144K)], 1.2151010 secs] [Times: user=6.83 sys=0.09, real=1.22 secs]