一个HeapTest的类,一个非静态的成员方法类型是自己,而且初始化的时候new自己, 在该类中写一个main方法,new自己抛的异常是栈空间内存溢出.
想请问一下:这两个无限创建的bytes和heapTest会被回收吗? 我的理解是不会回收的,因为他是被最开始new的那个HeapTest的引用的,初始化还没完成呢.但是抛出的这个异常让我感觉bytes应该是可回收的,要不是早就该抛出堆内存溢出的异常了,请有时间的大佬指点一下.
不会回收,java内存由java堆,java栈,方法区等组成,对象在创建的时候,实例对象是存放在java堆实例池中的。无线创建HeapTest,导致java栈中,当前线程所用到的栈的大小,远远超过最大值,因此报 java.lang.StackOverflowError,栈内存溢出。
1、当前实例池中的实例对象,一直是被引用的,常量池中的实例对象不会被回收,下次创建的时候,会根据java栈中reference数据,找到这个实例对象。(从执行,到内存溢出,一直是一个线程)
https://blog.csdn.net/loney_wolf/article/details/105143016
https://blog.csdn.net/loney_wolf/article/details/105561410
或许这两篇文章对你有帮助。个人理解
都不会回收,jvm回收机制是此对象没有被引用,也就是此对象指向为null时才会被回收,而你这种无线递归,一直没有对象指向为null,不会被回收