针对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
- Apache PDFBOX-使用split(PDDocument文档)时出现java.lang.OutOfMemoryError
- flume遇到java.lang.OutOfMemoryError: Java heap space
- HeapDumpOnOutOfMemoryError 使用
XX:+ HeapDumpOnOutOfMemoryError最大文件大小限制(文件大小超出4194303块的最大数)
我正在使用XX:+HeapDumpOnOutOfMemoryError
JVM标志运行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 当堆抛出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打开后,可以看到分析情况
由此也可以知道,是因为list的容量过大而导致OOM,可以根据此来进行优化代码或者JVM参数。
如果是由内存泄漏导致的,也可以通过工具查看泄漏对象到GC Roots的引用链,就能进行相应的分析处理。
另一个与之相关联的参数: -XX:HeapDumpPath=/temp/
该参数的含义是指定dump的文件目录
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-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 使用
将堆的最小值-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 使用的相关知识,请在本站搜索。
本文标签: