【发布时间】:2018-01-19 05:48:05
【问题描述】:
我们遇到了一个关于 jvm gc 的问题。我们有一个大型 QPS 应用程序,jvm 堆内存增加得非常快。它会在几秒钟内使用超过 2g 的堆内存,然后 gc 触发每次收集超过 2g 的内存也非常频繁。GC 收集情况如下图。所以这有两个问题
- gc 需要一些时间。更重要的是,它很频繁。
- 系统将不稳定。
public static void fun1() {
for(int i = 0; i < 5000; i++) {
Byte[] bs = new Byte[1024 * 1024 * 5];
bs = null;
}
}
所以,我有一些问题:
- 很多人说set object equals null会让gc线程收集起来很容易。这是什么意思?我们都知道,当 JVM 无法为新对象分配空间时,总会触发 Minor GC。因此,一个对象是否
为null,只有在空间不够时才会触发gc。所以 set object is null 没有意义。 - 如果存在大型短期对象,如何优化?我的意思是当年轻代不够时如何收集这些对象。
任何建议都会对我有所帮助。
【问题讨论】:
-
将局部变量设置为
null确实很少有任何效果。此外,我不明白你的实际问题,也不知道你有什么样的解决方案。一个 gc 周期的成本取决于幸存者对象的数量,因此如果在一个 gc 周期内回收了所有 2GiB 对象,则不会那么昂贵。您可以尝试使用Garbage-First Collector 平滑曲线,但更平滑的曲线并不意味着更高的性能...
标签: java memory-leaks garbage-collection jvm