gpt4 book ai didi

java - HeapDumpOnOutOfMemoryError 仅在周期性任务上工作一次

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:12 25 4
gpt4 key购买 nike

我有几个按指定时间间隔运行的应用程序。为了监控 OutOfMemoryError,我决定启用 HeapDumpOnOutOfMemoryError,在此之前我决定做一些研究。一些应用程序的最大堆大小为 2GB,因此快速连续生成多个堆转储可能会耗尽所有磁盘空间。

我写了一个小脚本来检查它是如何工作的。

import java.util.LinkedList;
import java.util.List;

public class Test implements Runnable{

public static void main(String[] args) throws Exception {
new Thread(new Test()).start();
}

public void run() {
while (true) {
try{
List<Object> list = new LinkedList<Object>();
while (true){
list.add(new Object());
}
}
catch (Throwable e){
System.out.println(e);
}
try {
Thread.sleep(1000);
}
catch (InterruptedException ignored) {

}
}
}
}

这是结果

$ java -XX:+HeapDumpOnOutOfMemoryError -Xmx2M Test                                                                                                                                                        
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid25711.hprof ...
Heap dump file created [14694890 bytes in 0,101 secs]
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

它按我希望的那样工作,但我想知道为什么。

查看 openjdk6 源代码我发现了以下内容

void report_java_out_of_memory(const char* message) {
static jint out_of_memory_reported = 0;

// A number of threads may attempt to report OutOfMemoryError at around the
// same time. To avoid dumping the heap or executing the data collection
// commands multiple times we just do it once when the first threads reports
// the error.
if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) {
// create heap dump before OnOutOfMemoryError commands are executed
if (HeapDumpOnOutOfMemoryError) {
tty->print_cr("java.lang.OutOfMemoryError: %s", message);
HeapDumper::dump_heap_from_oome();
}

if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
VMError err(message);
err.report_java_out_of_memory();
}
}
}

第一个 if 语句如何工作?

编辑:似乎每次打印消息时都应该创建堆转储,但它并没有发生。为什么会这样?

最佳答案

if 语句包含比较和交换原子操作,当且仅当交换由正在运行的线程执行时,该操作将返回 0。比较和交换(也称为比较和交换)的工作方式如下:

  • 提供您认为变量包含的值(在您的情况下为 0,变量为 out_of_memory_reported)
  • 提供您想要兑换的值(value)(在您的情况下为 1)
  • 如果该值是您提供的值,它将自动交换为替换值(在与您的估计值进行比较后,其他线程不得更改该值)并返回 0<
  • 否则,什么也不会发生,并返回一个不同于 0 的值以指示失败

关于java - HeapDumpOnOutOfMemoryError 仅在周期性任务上工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469299/

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