我使用Springboot构建了一个简单的应用程序。我在部署到Linux服务器时使用的ZGC垃圾收集器使用大量内存..我尝试使用Xmx500m将最大堆内存限制为500MB,但JAVA程序仍然使用了1GB以上。我用G1收集器的时候只用了350MB。不知道为什么,这是JDK11的BUG吗?还是我的启动参数有问题?####运行环境
java -Xms128m -Xmx500m \
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC \
-jar app.jar
Run Code Online (Sandbox Code Playgroud)
这是运行时内存使用情况的截图
堆内存使用情况 https://github.com/JoyfulAndSpeedyMan/assets/blob/master/2020-07-13%20201259.png?raw=true
系统内存使用情况 https://github.com/JoyfulAndSpeedyMan/assets/blob/master/2020-07-13%20201357.png?raw=true
以下是使用默认垃圾收集器 Java 启动命令时发生的情况
java -Xms128m -Xmx500m \
-jar app.jar
Run Code Online (Sandbox Code Playgroud)
堆内存使用情况 https://github.com/JoyfulAndSpeedyMan/assets/blob/master/2020-07-13%20202442.png?raw=true
系统内存使用情况 https://github.com/JoyfulAndSpeedyMan/assets/blob/master/2020-07-13%20202421.png?raw=true
jdk11 默认使用 G1 垃圾收集器。从理论上讲,G1不应该比ZGC更占用内存吗?我为什么不那样使用它?我误解了吗?由于我是JVM的初学者,我不明白为什么。
我听说 JDK 11 引入了一个名为 ZGC 的新垃圾收集器策略,但我找不到它代表什么。字母“Z”是什么意思?它有什么特定的含义吗?
zgc
我正在测试 11中包含的新垃圾收集器java
,因为它承诺非常低的延迟。我们的应用程序是一个实时服务,每秒创建和销毁许多对象,并且它在多线程环境中使用akka
.
当zgc
通过传递选项-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
和启用gc
日志来启用时,我们可以在日志中看到许多类似于以下的消息:
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-6) 11332.231ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-26) 9898.046ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-52) 12133.240ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-54) 9002.299ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-50) 12134.218ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-46) 12132.540ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-56) 8072.664ms
Run Code Online (Sandbox Code Playgroud)
几秒钟后,JVM 退出,没有给出任何原因。我们正在奔跑openjdk-java-11
。关于如何开展这项工作有什么建议吗?
由于它没有在https://wiki.openjdk.java.net/display/zgc/Main上列为选项,我认为它不受支持。一些测试代码让我想知道它是否受支持?
我正在使用-Xlog:safepoint+stats=debug:file=safepoint.log vm 参数在JDK12上运行应用程序以记录安全点操作并使用 ZGC 运行。我有理解日志输出的问题:
[1408.417s][debug][safepoint,stats] vmop [ threads: total initially_running wait_to_block ][ time: spin block sync cleanup vmop ] page_trap_count
[1412.164s][debug][safepoint,stats] 1412.162: ZOperation [ 376 0 7 ][ 0 0 0 0 1 ] 7
[1413.164s][debug][safepoint,stats] 1413.164: None [ 376 0 0 ][ 0 0 0 0 0 ] 0
[1414.165s][debug][safepoint,stats] 1414.164: None [ 376 0 1 ][ 0 0 0 0 0 ] 1
Run Code Online (Sandbox Code Playgroud)
我知道第一行告诉 ZOperation 花费了 1 毫秒,并且有 7 个线程参与了阻塞。
我不明白第二行,什么是“None” vmop 操作?看起来那个操作的持续时间是 …
我正在尝试使用 ZGC 垃圾收集器运行 Spring Boot 应用程序,并传入以下 JVM 选项build.gradle
:
bootRun {
jvmArgs = ["-XX:+UnlockExperimentalVMOptions", "-XX:+UseZGC", "-Xlog:gc*"]
}
Run Code Online (Sandbox Code Playgroud)
运行应用程序 ( gradle bootRun
) 时出现以下错误:
> Task :bootRun FAILED
Error occurred during initialization of VM
Option -XX:+UseZGC not supported
Run Code Online (Sandbox Code Playgroud)
java - 版本:
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我正在运行 10.15.2 (19C57) 版本的 macOS (Catalina)。只是 macOS 的问题吗?
我正在使用Java 11
新的 Z 垃圾收集器 (ZGC) 似乎很有前途。
文档说它使用了一些低延迟垃圾收集机制,这样GC
暂停时间永远不会超过10 ms
,非常好地处理大堆,并允许将未使用的堆内存返回给操作系统,而旧的 GC 不存在
我担心的是 - ZGC 的稳定性如何,如果在生产中继续推进,是否存在风险?
谢谢!