我有一个网络服务应用程序,每分钟可以接收数百个请求。使用默认 GC,Java 8 中的 VM 每隔几分钟就会停止一次世界,因此会发生某些请求非常慢的情况。
我将 GC 更改为 G1,如下所示:
-XX:+UseG1GC
但是我在这里读到 G1 比较慢:
http://www.optaplanner.org/blog/2015/07/31/WhatIsTheFastestGarbageCollectorInJava8.html
有没有办法使用默认的 Java 8 收集器更频繁地停止世界,从而减少对某些请求的创伤性影响?还有什么其他解决方案?
最佳答案
您的问题意味着您对“垃圾收集器”设置的想法远非幼稚。
所有最近的垃圾收集器都有不同的属性;他们有大量的设置可以用来改变他们的行为以实现某些目标。
意思:G1慢一点没关系。如果您可以以比当前设置更好为您的应用程序服务的方式对其进行调整,那么这将是您应该做出的选择。
长话短说:您的应用程序的(垃圾收集)性能似乎是一个真实问题。然后只有一件事要做:开始测量。了解您的代码在做什么;它是怎么做到的;以及它如何与 JIT 和 GC“交互”。然后确定要优化的目标;并开始进行实验(理想情况下,您只更改一个配置更改)以找到让您朝着该目标前进的 JIT/GC 调优设置。
示例:也许使用 G1 就足够了;并给出一个适合你的“暂停时间目标”。但是也许您必须为您的 JVM 启用“gc tracing”;了解 GC 必须为您的应用程序做多少工作;也许答案是修复您的代码中的某些内容……以简单地产生更少的垃圾。
如:调整 GC 没有多大意义;如果您的应用程序每分钟产生(可避免的)GB 的“垃圾”。
关于java - Java8 中的 GC 和停止 Web 服务的世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37609632/