GVKun编程网logo

XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制(文件大小超出4194303块的最大数)

6

针对XX:+HeapDumpOnOutOfMemoryError最大文件大小限制和文件大小超出4194303块的最大数这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展-XX:HeapDump

针对XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制文件大小超出4194303块的最大数这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展-XX:HeapDumpOnOutOfMemoryError、Apache PDFBOX-使用split(PDDocument文档)时出现java.lang.OutOfMemoryError、flume遇到java.lang.OutOfMemoryError: Java heap space、HeapDumpOnOutOfMemoryError 使用等相关知识,希望可以帮助到你。

本文目录一览:

XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制(文件大小超出4194303块的最大数)

XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制(文件大小超出4194303块的最大数)

我正在使用XX:+HeapDumpOnOutOfMemoryErrorJVM标志运行Java进程,并看到以下输出:

java.lang.OutOfMemoryError: Java heap spaceDumping heap to /local/disk2/heaps/heapdump.hprof ...Dump file is incomplete: file size limit

有没有办法解决这个问题?

答案1

小编典典

-XX:+HeapDumpOnOutOfMemoryError当无法满足Java堆的分配或永久生成时,命令行选项告诉HotSpot
VM生成堆转储。使用此选项运行不会产生任何开销,因此对于OutOfMemoryError需要很长时间才能浮出水面的生产系统很有用。

为了解决您面临的特定问题,可以使用以下纠正措施之一:

措施1: XX:HeapDumpSegmentSize

-XX:HeapDumpSegmentSize选项在生成分段的HPROF堆转储时指定适当的段大小。

格式

-XX:HeapDumpSegmentSize =大小[k | K] [m | M] [g | G]

java -XX:+HeapDumpOnOutOfMemory -XX:HeapDumpSegmentSize=512M myApp

预设值
1 GB

措施2 -XX:SegmentedHeapDumpThreshold

当堆使用量大于指定大小时,-XX:SegmentedHeapDumpThreshold选项将生成分段堆转储(.hprof文件,1.0.2格式)。

需要分段的HPROF转储格式才能正确生成包含4 GB以上数据的堆转储。如果-XX:SegmentedHeapDumpThreshold选项的值设置为大于4
GB,则可能无法正确生成堆转储。

格式
-XX:SegmentedHeapDumpThreshold =大小

java -XX:SegmentedHeapDumpThreshold=512M myApp

默认值
2 GB

-XX:HeapDumpOnOutOfMemoryError

-XX:HeapDumpOnOutOfMemoryError

用法: -XX:+HeapDumpOnOutOfMemoryError 当堆抛出OOM错误时,dump出当前的内存堆转储快照。

举个栗子

public class OOM {

    static class OOMObject {

    }

    //-Xmx20M -Xms20M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    public static void main(String[] args) {
        List<OOMObject> list = new LinkedList<>();
        while(true) {
            list.add(new OOMObject());
        }
    }

}

这个例子很简单,就是不断创建OOMObject,加入到list中(为了让GC Roots到对象之间有可达路径,避免被GC),直到堆内存不够时,抛出OOM异常。

运行后,控制台打印信息

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid97312.hprof ... 
Heap dump file created [33684485 bytes in 0.424 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.gc.OOM.main(OOM.java:19)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

可以看到dump出了hprof文件可供分析,可以用MAT工具进行分析

用MAT打开后,可以看到分析情况

image.png

image.png

由此也可以知道,是因为list的容量过大而导致OOM,可以根据此来进行优化代码或者JVM参数。

如果是由内存泄漏导致的,也可以通过工具查看泄漏对象到GC Roots的引用链,就能进行相应的分析处理。

另一个与之相关联的参数: -XX:HeapDumpPath=/temp/ 该参数的含义是指定dump的文件目录

Apache PDFBOX-使用split(PDDocument文档)时出现java.lang.OutOfMemoryError

Apache PDFBOX-使用split(PDDocument文档)时出现java.lang.OutOfMemoryError

我正在尝试使用Apache PDFBOX API V2.0.2拆分300页的文档。尝试使用以下代码将pdf文件拆分为单个页面时:

        PDDocument document = PDDocument.load(inputFile);        Splitter splitter = new Splitter();        List<PDDocument> splittedDocuments = splitter.split(document); //Exception happens here

我收到以下异常

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

这表明GC需要花费大量时间来清除没有被回收量证明合理的堆。

有许多JVM调优方法可以解决这种情况,但是,所有这些方法都只是在解决症状而不是真正的问题。

最后一点,我正在使用JDK6,因此在我的情况下,不能使用新的Java 8 Consumer。

编辑:

这不是http://codingdict.com/questions/159530的重复问题,如下所示:

 1.我没有上述提到的尺寸问题    话题。我将270页的13.8MB切片,然后切片    每个切片的大小平均为80KB,总大小为    30.7兆字节 2.即使在拆分之前,拆分也会引发异常。

我发现只要不传递整个文档,拆分就可以通过,而是将其作为“批量”传递,每个批量20-30页,即可完成工作。

答案1

小编典典

PDF
Box将拆分操作产生的零件作为PDDocument类型的对象存储为堆中的对象,这会导致堆快速填充,即使在循环的每一轮之后调用close()操作,GC仍会无法以与填充相同的方式回收堆大小。

一种选择是将文档拆分操作拆分为多个批次,其中每个批次是一个相对易于管理的块(10至40页)

public void execute() {    File inputFile = new File(path/to/the/file.pdf);    PDDocument document = null;    try {        document = PDDocument.load(inputFile);        int start = 1;        int end = 1;        int batchSize = 50;        int finalBatchSize = document.getNumberOfPages() % batchSize;        int noOfBatches = document.getNumberOfPages() / batchSize;        for (int i = 1; i <= noOfBatches; i++) {            start = end;            end = start + batchSize;            System.out.println("Batch: " + i + " start: " + start + " end: " + end);            split(document, start, end);        }        // handling the remaining        start = end;        end += finalBatchSize;        System.out.println("Final Batch  start: " + start + " end: " + end);        split(document, start, end);    } catch (IOException e) {        e.printStackTrace();    } finally {        //close the document    }}private void split(PDDocument document, int start, int end) throws IOException {    List<File> fileList = new ArrayList<File>();    Splitter splitter = new Splitter();    splitter.setStartPage(start);    splitter.setEndPage(end);    List<PDDocument> splittedDocuments = splitter.split(document);    String outputPath = Config.INSTANCE.getProperty("outputPath");    PDFTextStripper stripper = new PDFTextStripper();    for (int index = 0; index < splittedDocuments.size(); index++) {        String pdfFullPath = document.getDocumentInformation().getTitle() + index + start+ ".pdf";        PDDocument splittedDocument = splittedDocuments.get(index);        splittedDocument.save(pdfFullPath);    }}

flume遇到java.lang.OutOfMemoryError: Java heap space

flume遇到java.lang.OutOfMemoryError: Java heap space

当使用flume-ng进行日志采集的时候,如果日志文件很大,容易导致flume出现:

java.lang.OutOfMemoryError: Java heap space 产生这样错误主要是内存的原因,

1 因为我的channel是存在内存中的,所以我修改了flume的配置文件,将channel修改为file, 另外需要调整flume相应的jvm启动参数。

2 修改 flume下的conf/flume-env.sh文件:

export JAVA_OPTS="-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote" 其中:

-Xms<size> set initial Java heap size......................... -Xmx<size> set maximum Java heap size.........................

主要修改Xmx和Xms两个参数,可以根据OS内存的大小进行合理设置,一般一个flume agent 1G左右大小即可


如果有flume问题,请加QQ群:140467035 ,共同学习进步

HeapDumpOnOutOfMemoryError 使用

HeapDumpOnOutOfMemoryError 使用

将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩

展.

https://my.oschina.net/xiangtao/blog/511622

https://my.oschina.net/13510434519/blog/850101

https://my.oschina.net/u/3110327/blog/850521

https://blog.csdn.net/pfnie/article/details/52766204?locationNum=13&fps=1

重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory 

Overflow)。

如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关

联并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确地定位出泄

漏代码的位置。


如果不存在泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内

存对比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存

消耗。


《深入理解java虚拟机》

今天关于XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制文件大小超出4194303块的最大数的讲解已经结束,谢谢您的阅读,如果想了解更多关于-XX:HeapDumpOnOutOfMemoryError、Apache PDFBOX-使用split(PDDocument文档)时出现java.lang.OutOfMemoryError、flume遇到java.lang.OutOfMemoryError: Java heap space、HeapDumpOnOutOfMemoryError 使用的相关知识,请在本站搜索。

本文标签: