- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有几个按指定时间间隔运行的应用程序。为了监控 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。比较和交换(也称为比较和交换)的工作方式如下:
关于java - HeapDumpOnOutOfMemoryError 仅在周期性任务上工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469299/
在甲骨文的official doc HeapDumpOnOutOfMemoryError 选项用加号和减号指定。我很好奇它们代表什么,因为官方用户指南中没有解释 最佳答案 来自page你引用了: So
在 Windows 上的 Maven 中运行我的单元测试时,我收到 OutOfMemory 异常。我试图将 -XX:-HeapDumpOnOutOfMemoryError 选项添加到surefire
我有几个按指定时间间隔运行的应用程序。为了监控 OutOfMemoryError,我决定启用 HeapDumpOnOutOfMemoryError,在此之前我决定做一些研究。一些应用程序的最大堆大小为
根据 http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/clopts.html应该可以在运行时使用 JConsole 启用 -XX:+
我正在尝试启动 cassandra(与厨师一起安装)并且总是收到此错误 xss = -ea -javaagent:/usr/share/cassandra/lib/jamm-0.2.5.jar -X
我的程序抛出以下异常: java.lang.OutOfMemoryError: unable to create new native thread 但是当我将 -XX:+HeapDumpOnOutO
在 Linux 上,当使用 -XX+HeapDumpOnOutOfMemoryError 时,生成的 hprof 文件归运行 java 进程的用户所有,权限为 600。 我知道这些权限是最安全的,但是
我最近了解了 -XX:+HeapDumpOnOutOfMemoryError VM 参数,并被告知应该将其添加到 HotSpot JVM,因为默认情况下它是关闭的。我的一位同事评论说也许我们不应该这样
我通过以下方式启动 ElasticSearch echo "export ES_HEAP_SIZE = 4096" >> /root/setenv echo "export ES_MAX_MEM =
我用这些参数启动我的 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/log/${SERVICE}_`date +%Y-%m-%d:%H:
"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp" 此参数将有助于在达到服务器限制时自动进行堆转储。 http://www.oracle.c
我使用以下参数(以及其他参数)开始我的 Java 代码(Vista 中的 1.6.0_16)-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../lo
我正在运行带有 XX:+HeapDumpOnOutOfMemoryError JVM 标志的 Java 进程并看到以下输出: java.lang.OutOfMemoryError: Java heap
我正在尝试安装 Sonar 以获取我的项目的一些统计信息,但出现此错误: --> Wrapper Started as Console Launching a JVM... Unre
在内存不足时创建堆转储的指令 (-XX:+HeapDumpOnOutOfMemoryError) 是否会导致 Tomcat 7 在生产环境中出现任何安全或值得注意的性能问题? (当然,服务器在“崩溃”
我正在按照在 Install Cassandra 安装 cassandra 的说明进行操作。 当我安装时,我得到以下。我该如何解决? service cassandra start xss = -e
Windows PC 上 Tomcat 的 startup.bat 文件中设置的 HeapDumpOnOutOfMemoryError 和 HeapDumpPath 参数在哪里?我将两个参数都放在文件
我是一名优秀的程序员,十分优秀!