gpt4 book ai didi

java - 如何通过堆中的许多 StackTraceElement 模拟完整的 gc

转载 作者:行者123 更新时间:2023-11-29 04:52:09 25 4
gpt4 key购买 nike

最近运营同事反射(reflect)生产环境有很多full gc,影响app响应时间。他提供了一个图像 enter image description here

他特别说StackTraceElement有85M,建议不要有这些代码,例如

e.printStackTrace();

现在我想在本地模拟这种情况,写了如下测试代码

public class FullGCByLogTest {
private static final Logger log = Logger.getLogger(FullGCByLogTest.class);
public static final byte[] _1M = new byte[1 * 1024 * 1024]; //placeholder purpose

public static void main(String[] args) throws InterruptedException {
int nThreads = 1000; // concurrent count
ExecutorService pool = Executors.newFixedThreadPool(nThreads);
while (true) {
final CountDownLatch latch = new CountDownLatch(nThreads);
for (int i = 0; i < nThreads; i++) {
pool.submit(new Runnable() {
@Override
public void run() {
latch.countDown();
try {
latch.await(); // waiting for execute below code concurrently
} catch (InterruptedException e1) {
}
try {
int i = 1 / 0;
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
// log.error(e.getMessage(), e);
}

}
});
}
try {
Thread.sleep(100); // interval 1s every concurrent calling
} catch (InterruptedException e) {
}
}

}
}

我用这些 vm args 运行这个类

-Xmx4m -Xms4m -XX:NewSize=1m -XX:MaxNewSize=1m -XX:+PrintGCDetails

然后在 jvisualvm VisualGC 中我发现 old gen 是 7 M,但我设置的 max heap 是 4m。

enter image description here

另外在 heapdump 中我没有找到 StackTraceElement。那么我怎样才能成功模拟这个问题呢?

enter image description here

最佳答案

StackTraceElement 对象实际上是在实例化异常对象时创建的,一旦异常对象无法访问,它们就符合垃圾回收条件。

我怀疑你的(明显的)存储泄漏的真正原因是你的代码中的某些东西正在保存大量异常对象。

调用 printStackTrace() 不会泄漏对象。您的同事误诊了问题。然而,到处调用 printStackTrace() 是很丑陋的......如果它频繁发生,那将导致性能问题。


您的模拟和结果是一个转移注意力的问题,但堆比您要求的大的可能原因是 JVM 已“四舍五入”到更大的堆大小。 (4Mb 是一个极小的堆大小,对于大多数 Java 程序来说是不切实际的。)


So how could I emulate this problem successfully?

仿真极不可能告诉您任何有用的信息。您需要从生产系统获取堆转储并对其进行分析。

关于java - 如何通过堆中的许多 StackTraceElement 模拟完整的 gc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com