Tag: garbage collection

Java新String和堆行为中的新StringBuilder

String池是否驻留在堆上? 如果是,String字符串是否有资格进行垃圾回收? 当使用new String(“abc”) ,我们知道它在堆上创建了一个对象并将String文本放在String池中。 所以我的第二个问题是: new StringBuilder(“abc”)行为与new String(“abc”)行为方式相同吗? 如果是,StringBuilder如何操作String池中的String文字?

java.lang.OutOfMemoryError:加载xlsx文件时超出了GC开销限制

我理解错误意味着什么,我的程序消耗了太多的内存,并且很长一段时间它没有恢复。 当发生内存问题时,我的程序只读取6,2Mb xlsx文件。 当我尝试监视程序时,内存消耗很快达到1,2Gb,然后崩溃。 读取6,2Mb文件时如何达到1,2Gb? 有没有办法以块的forms打开文件? 这样它就不必加载到内存中了? 或任何其他解决方案? 正是这部分导致了它。 但既然它是一个图书馆,难道不应该以某种方式处理它吗? 它只有20万行,只有3列。 对于未来,我需要它与约。 1百万条记录和更多列… 码: Workbook myWorkBook; Sheet mySheet; if (filePath.contains(“.xlsx”)) { // Finds the workbook instance for XLSX file myWorkBook = new XSSFWorkbook(fis); // Return first sheet from the XLSX workbook mySheet = myWorkBook.getSheetAt(0); myWorkBook.close(); // Should I close myWorkBook before I get data from […]

Java子串内存泄漏

基于关于获取String Java String.split内存泄漏的子串的讨论? ,我一直在分析两个示例子字符串的用法示例。 据说,如果调用者在对象中存储字段的子字符串,则对象不会被垃圾收集。 当我运行代码时我获得了OutofMemoryexception,并在通过VisualVM监视它时看到char []分配大小的增加 public class TestGC { private String largeString = new String(new byte[100000]); String getString() { return this.largeString.substring(0,2); //return new String(this.largeString.substring(0,2)); } public static void main(String[] args) { java.util.ArrayList list = new java.util.ArrayList(); for (int i = 0; i < 100000; i++) { TestGC gc = new TestGC(); list.add(gc.getString()); } […]

在这种情况下何时会在我的类实例上调用finalize()?

我知道每当垃圾收集器收集一个类实例时都会调用finalize()。 但是,当通过队列将类的实例传递给另一个线程时,我有点困惑。 假设这是Thread1的骨架: for(i=0; i<1000; i++) { Packet pkt = new Packet(); // instance of class pkt.id = i; thread2.queue.put(pkt); } 然后,线程2将从队列中删除数据包并执行冗长的操作。 这第二个线程是否获得了数据包的“副本”,还是通过某种forms的引用? 重要的是,如果它是通过复制,则可以在线程2完成数据包之前调用在线程1中创建的实例上的finalize()。 如果它是通过引用,我保证只对包中的信息调用finalize()一次。 这个基本示例可能没有显示重要性,但我在数据包中存储了一个C指针(来自JNI),以便在完成对象时销毁一些内存。 如果它是通过副本传递的,则内存可能会在第二个线程完成之前被销毁。 如果它是通过引用传递的,那么它应该只在GC看到BOTH线程不再使用它时才被销毁(我想要的行为)。 如果后一种情况得不到保证,我不会使用finalize()并使用其他东西,但会更复杂。

Apache NiFi – OutOfMemory错误:SplitText处理器超出了GC开销限制

我正在尝试使用NiFi使用HDF 1.2处理大型CSV文件(每个可能有数十亿条记录)。 我实现了我的流程,一切都适用于小文件。 问题是如果我尝试将文件大小推到100MB(1M记录),我会得到一个java.lang.OutOfMemoryError: GC overhead limit exceeded从负责将文件拆分为单个记录的SplitText处理器java.lang.OutOfMemoryError: GC overhead limit exceeded 。 我已经搜索过了,它基本上意味着垃圾收集器执行的时间太长而没有获得太多的堆空间。 我希望这意味着太多的流文件生成得太快了。 我怎么解决这个问题? 我已经尝试改变nifi关于最大堆空间和其他与内存相关的属性的配置,但似乎没有任何效果。 现在我添加了一个行数为1K的中间SplitText ,这可以让我避免错误,但我不认为这是一个可靠的解决方案,当传入的文件大小可能远远超过这个时,我担心我将从处理器获得相同的行为。 欢迎任何建议! 谢谢

资源泄漏:使用Apache.POI XSSFWorkbook时,工作簿永远不会被关闭

因此,我使用Apache POI将Excel文件解析为我的数据库。 为此,我正在初始化XSSFWorkbook如下: XSSFWorkbook workbook = new XSSFWorkbook(fIP); 然后我继续我的方法。 workbook.close()不可用作以后关闭工作簿的方法。 有关如何在任务完成后让垃圾收集进入工作簿的任何想法?

从Java 6 + Tomcat 6升级到Java 8 + Tomcat 8时的垃圾收集器使用情况

我们正在从Java 6和Tomcat 6升级到Java 1.8.0_45和Tomcat 8.0.23,Linux服务器,64位。 我正在比较内存使用情况,而我正面临一种奇怪的行为。 这就是Eden Space在Tomcat 8中使用Java 8的方式,没有流量,只是启动和空闲: 这就是Java 6的标准,对我来说是标准的: 两个JVM的配置方式基本相同,基本上: XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -Xms768m -Xmx2048m -Xmn400m 使用Java 8和Tomcat 8,小型GC几乎总是在运行,而tomcat日志显示如下: 1301,121: [GC (Allocation Failure) [PSYoungGen: 408960K->352K(409088K)] 1126151K->717559K(1915392K), 0,0093033 secs] [Times: user=0,02 sys=0,00, real=0,01 secs] 您是否知道JVM 8的一些特殊配置或我必须做的事情才能拥有与之前相同的行为? 编辑: 30分钟后,伊甸园空间是:

在java 9中处理PrintGCApplicationStoppedTime标志

我的应用程序使用gc标志“PrintGCApplicationStoppedTime”,但是当我使用Java 9运行它时,它失败并出现以下错误: Unrecognized VM option ‘PrintGCApplicationStoppedTime’ Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 这篇文章表明该选项已被弃用,但是他的旗帜打印的信息是否有其他选择,或者此信息不再可用?

堆转储中不可能的Java内存引用

我在下午7:41进行了Java堆转储,我正在使用Eclipse内存分析工具进行分析。 堆转储包括20个会话对象。 在我的堆中的其中一个会话对象上使用Path to GC Roots命令显示以下3个对会话对象的引用。 Finalizer线程拥有的“未完成”链表的终结器引用。 我的目标是排在第3位,最终确定。 来自消息处理程序线程的对会话对象的强引用,该消息处理程序线程本身是从计划在晚上7:11运行的清理TimerTask引用的。 WeakHashMap $ Entry对会话对象的弱引用。 WeakHashMap通过静态强引用保持活动状态。 当会话对象仍然具有强引用和弱引用时,它如何才能在终结器队列中? 在剩余的19个会话对象中,还有1个在终结器队列中,并且具有类似的弱引用。 所有其他18个会话对象仅被弱引用。 为什么GC没有清除这些弱的参考? 几点概括: 对象只有在他们的弱引用被清除后才有资格完成(http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html) 会话对象没有可以复活它的终结器,即使它已经完成,但是当对象仍处于其他对象后面的未终结队列中时,它无法运行。 我的应用程序不使用幻影引用,它是唯一一个对象有资格完成后应该能够存在的引用。 即使我的应用程序确实使用幻像引用,这些对象也不会公开它们对所持对象的引用。

对象未完成,Finalizer线程没有做任何事情

在我们的服务器上,我们开始遇到OutOfMemoryError问题。 我们使用Eclipse Memory Analysis分析了堆转储,并发现许多对象被认为是最终确定的(大约是堆的2/3): 我们发现,它可能是一些finalize()方法阻塞。 我发现了这个问题的几个错误报告( 这里或这里 ),它总是在Finalizer线程堆栈中表现出来,它在某个地方被阻止了。 但在我们的例子中,这个post是等待的: “Finalizer” daemon prio=10 tid=0x43e1e000 nid=0x3ff in Object.wait() [0x43dfe000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) – waiting on (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133) – locked (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189) 编辑: 然后我们尝试添加-XX:+UseConcMarkSweepGC ,但没有成功,只有OutOfMemoryError的频率减少了,所以我们首先想到它有所帮助。 最后,我们怀疑JVM错误并从OpenJDK 1.6.0_30升级到Oracle JDK 1.7.0_51,问题消失了(至少看起来如此,在过去4小时内使用的堆没有增长)。 我们不记得finalize方法有任何变化,我们也没有升级任何库,在那段时间里只有很小的发展。 问题不会在我们的测试服务器上重现,具有相同的配置,除了它是64位JVM而生产服务器是32位。 问题是:对象未完成的原因是什么, Finalizer线程等待下一个对象? 我们是否正确分析了堆转储? 谢谢你的所有答案。