【问题标题】:java.lang.OutOfMemoryError: Java heap space - Stack Trace Meaningjava.lang.OutOfMemoryError:Java堆空间 - 堆栈跟踪含义
【发布时间】:2015-01-27 17:28:32
【问题描述】:

我在一个长期存在的应用程序中有一条消息,java.lang.OutOfMemoryError: Java heap space。

我想知道错误信息后显示的堆栈跟踪的含义;我可以找到阅读此跟踪的问题吗?堆栈跟踪是什么意思?

java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapIntBuffer.<init>(Unknown Source)
    at java.nio.IntBuffer.allocate(Unknown Source)
    at com.sun.javafx.tk.quantum.UploadingPainter.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at com.sun.javafx.tk.RenderJob.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapIntBuffer.<init>(Unknown Source)
    at java.nio.IntBuffer.allocate(Unknown Source)
    at com.sun.javafx.tk.quantum.UploadingPainter.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at com.sun.javafx.tk.RenderJob.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapIntBuffer.<init>(Unknown Source)
    at java.nio.IntBuffer.allocate(Unknown Source)
    at com.sun.javafx.tk.quantum.UploadingPainter.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at com.sun.javafx.tk.RenderJob.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapIntBuffer.<init>(Unknown Source)
    at java.nio.IntBuffer.allocate(Unknown Source)
    at com.sun.javafx.tk.quantum.UploadingPainter.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at com.sun.javafx.tk.RenderJob.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

谢谢。

【问题讨论】:

  • 您的应用程序占用了太多内存。如果您需要查找特定问题,请使用 Java Profiler
  • 获取堆转储并在 Eclipse Memory Analyzer 等堆转储分析器中进行分析。
  • 感谢 Rupesh 我正在尝试使用 Java Mission Control...

标签: java memory-leaks javafx jvm


【解决方案1】:

不幸的是,堆栈只是表示未能分配内存的调用,但这可能不是原因。您的程序中可能有其他部分正在泄漏内存,或者您正在打开一个大文档,或者如果您的应用程序是基于 Web 的,太多的用户正在运行某个进程并且他们正在使用所有内存。 jvisualvm.exe(包含在您的 jdk 中)是分析内存的绝佳工具。

【讨论】:

  • 我一直在使用 Java Mission Control。这是一个非常好的平台,可以查看我的应用程序中发生了什么。我看到,在这张图 (link) 中,一个名为“QuantumRenderer-0”的线程表示分配过程的压力很大。你知道这个线程的作用吗?
  • QuantumRenderer 与 JavaFX 有关,但分配的内存量并不一定意味着它使堆过载,线程只是使用了大量内存。您需要对堆进行快照以查找所有内存分配的位置。在拍摄快照之前,请确保执行垃圾收集。
【解决方案2】:

java.lang.OutOfMemoryError:Java 堆空间

Java 应用程序可以使用有限的内存量。此限制在应用程序启动期间指定。 Java 内存分为两个不同的区域。

这些区域称为堆空间permgen:

这些区域的大小是在 Java 虚拟机 (JVM) 启动期间通过指定参数设置的,例如 -Xmx 和 -XX:MaxPermSize。 Here你可以看看如何设置这些参数

如果您没有明确设置大小,将使用特定于平台的默认值。

所以,当您尝试向堆空间区域添加更多数据,但没有足够的空间时,将触发“java.lang.OutOfMemoryError: Java heap space”错误。

请注意,可能有大量可用物理内存,但如果已达到此 Java 程序的堆大小限制,则会引发“java.lang.OutOfMemoryError: Java heap space”错误。

java.lang.OutOfMemoryError 的原因:Java 堆空间

  1. 使用量/数据量激增。

该应用程序旨在处理 一定数量的用户或一定数量的数据。现在,当 用户数或数据量突然激增,操作 在尖峰停止响应和 触发 java.lang.OutOfMemoryError: Java heap space error。

  1. 列表项

特定类型的编程错误会导致您的应用程序不断消耗更多内存。每次使用应用程序的泄漏功能时,都会将一些对象留在 Java 堆空间中。随着时间的推移,泄漏的对象会消耗所有可用的 Java 堆空间并触发已经熟悉的 java.lang.OutOfMemoryError: Java heap space 错误。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多