java - Xmx 和 gc 日志数据不匹配

标签 java garbage-collection jvm

我使用下面的jvm参数运行了一个测试程序(在无限循环中添加带有字符串的列表)

java -XX:+PrintGCDetails -Xloggc:gc.log Test -Xmx=1k -Xms=1k

并得到以下异常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

在 gc 日志中,我看到以下集合作为最后一个条目

11.242: [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(92160K)] [ParOldGen: 274084K->274072K(371712K)] 274084K->274072K(**463872K**), [Metaspace: 2522K->2522K(1056768K)], 3.0296130 secs] [Times: user=3.28 sys=0.00, real=3.02 secs] 

如果最小值和最大值均为 1k,为什么可用堆内存显示为 463872K

在oracle站点中添加

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

我看到一条注释,

注意:-Xmx不限制JVM可以使用的内存总量。

这是什么意思?

最佳答案

您已在类名称后指定了 XmxXms 参数。因此,java 可执行命令将它们解释为类的参数,而不是配置 JVM 的选项。正确的做法是:

java -Xmx1k -Xms1k -XX:+PrintGCDetails -Xloggc:gc.log Test

另请注意,正确的格式是 -Xmx1k,而不是 -Xmx=1k

但请注意,JVM 不会以如此低的 Xms 值启动。

关于java - Xmx 和 gc 日志数据不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39810053/

相关文章:

java - Drools 知识库已弃用

java - JFrame 不显示 Canvas

c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?

Java 类加载器独立于 jar 文件的系统类加载器

java - java中 double 的乘法给出了错误的结果

java - 将自然语言转换为数学方程式

java - 扫描仪一开始就忽略空白

scala - Scala actor应用程序的奇怪GC行为

Java - 为什么 GC 时间会随着堆的增长(就容量而言)而增加?

java - Java java.util.concurrent.locks.Lock 如何保证线程之间的内存同步?