java.lang.OutOfMemoryError:Java堆空间 - 堆栈跟踪含义

时间:2015-01-27 17:28:33

标签: java memory-leaks javafx jvm

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

我想知道错误消息后显示的堆栈跟踪的含义;我能找到读这个痕迹的问题吗?堆栈跟踪的含义是什么?

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)

谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

java.lang.OutOfMemoryError:Java堆空间

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

这些区域称为堆 空间 permgen:

Diffrent Memory Region

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

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

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

请注意,可能有大量可用的物理内存,但如果此Java程序的堆大小限制已被命中,则会抛出“java.lang.OutOfMemoryError:Java堆空间”错误。

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

  1. 使用量/数据量激增。
  2. 该应用程序旨在处理    一定数量的用户或一定数量的数据。现在,当    用户数量或数据量突然飙升,操作    在尖峰停止响应之前正常运行    触发java.lang.OutOfMemoryError:Java堆空间错误。

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