首页编程java编程java什么对象会被回收,在java中,对象什么时候可以被垃圾回收

java什么对象会被回收,在java中,对象什么时候可以被垃圾回收

编程之家2023-10-1297次浏览

大家好,如果您还对java什么对象会被回收不太了解,没有关系,今天就由本站为大家分享java什么对象会被回收的知识,包括在java中,对象什么时候可以被垃圾回收的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

java什么对象会被回收,在java中,对象什么时候可以被垃圾回收

JAVA:类似链表的对象会被垃圾回收吗

就像《寻梦环游记》说的那样,人真正的死亡是世界上没人记得他了。对象也是如此,没被引用也就面临被回收的结局。链表中单向链表做例子,每个结点都是引用和被引用的线性关系,只要你不把"头"对象(引用)搞丢,其后面关系的对象都不会消失(被回收);

java对象池里的对象如果长时间不被使用,会被jvm垃圾回收吗

GC是有条件的,我们的确可以在一定硬件基础上配置这个条件让GC少发生,GC是耗资源性能的,

很多时候我们都是通过减少GC来提高系统的性能。

java什么对象会被回收,在java中,对象什么时候可以被垃圾回收

你说得对,对象池的大小不会造成内存紧张,基本上jvm是不会回收的,但是我们不能保证。

所以不要把这个放到你的业务逻辑里去,就像尽量不要把异常与业务逻辑挂钩。

java什么对象会被回收,在java中,对象什么时候可以被垃圾回收

如果在你的程序里,能找到这样的一条引用方向,那么这个单体类是不会被回收的。

main->实例A->...->实例D->你所说的单体

GC发生时,判断对象是否需要回收不是看是否被调用,而是是否被引用。

比如,main函数所在的类中所引用的成员变量List是不会被回收的。直到程序结束。

如果你的单体类只有一个,相信这个单体类还是一直被引用这比较好。这样就不会被回收了。

-------------------------

java对象是否被垃圾回收不是看时间长短的,

是看是否被使用着,如果没有被使用,又到了垃圾回收的条件时,

就会被回收的。

如果是被使用的,那么不管怎么样都不会被回收的。

如果是静态变量的话,看这个类是否被使用了。

在Java中,对象什么时候可以被垃圾回收

1.引用计数器算法

解释

系统给每个对象添加一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,当引用失效的时候,计数器就减1,在任何一个时刻计数器为0的对象就是不可能被使用的对象,因为没有任何地方持有这个引用,这时这个对象就被视为内存垃圾,等待被虚拟机回收

优点

客观的说,引用计数器算法,他的实现很简单,判定的效率很高,在大部分情况下这都是相当不错的算法

其实,很多案例中都使用了这种算法,比如 IOS的Object-C,微软的COM技术(用于给window开发驱动,.net里面的技术几乎都是建立在COM上的),Python语言等.

缺陷

无法解决循环引用的问题.

这就好像是悬崖边的人采集草药的人,想要活下去就必须要有一根绳子绑在悬崖上.如果有两个人,甲的手拉着悬崖,乙的手拉着甲,那么这两个人都能活,但是,如果甲的手拉着乙,乙的手也拉着甲,虽然这两个人都认为自己被别人拉着,但是一样会掉下悬崖.

比如说 A对象的一个属性引用B,B对象的一个属性同时引用A A.b= B() B.a= A();这个A,B对象的计数器都是1,可是,如果没有其他任何地方引用A,B对象的时候,A,B对象其实在系统中是无法发挥任何作用的,既然无法发挥作用,那就应该被视作内存垃圾予以清理掉,可是因为此时A,B的计数器的值都是1,虚拟机就无法回收A,B对象,这样就会造成内存浪费,这在计算机系统中是不可容忍的.

解决办法

在语言层面处理,例如Object-C就使用强弱引用类型来解决问题.强引用计数器加1,弱引用不增加

Java中也有强弱引用

2.可达性分析算法

解释

这种算法通过一系列成为"GC Roots"的对象作为起始点,从这些节点开始向下搜索所有走过的路径成为引用链(Reference Chain),当一个对象GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达),则证明此对象是不可用的

优点

这个算法可以轻松的解决循环引用的问题

大部分的主流java虚拟机使用的都是这种算法

3. Java语言中的GC Roots

在虚拟机栈(其实是栈帧中的本地变量表)中引用的对象

在方法区中的类静态属性引用对象

在方法区中的常量引用的对象

在本地方法栈中JNI(即一般说的Native方法)的引用对象

在java中,对象什么时候可以被垃圾回收

1.引用计数器算法

解释

系统给每个对象添加一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,当引用失效的时候,计数器就减1,在任何一个时刻计数器为0的对象就是不可能被使用的对象,因为没有任何地方持有这个引用,这时这个对象就被视为内存垃圾,等待被虚拟机回收

优点

客观的说,引用计数器算法,他的实现很简单,判定的效率很高,在大部分情况下这都是相当不错的算法

其实,很多案例中都使用了这种算法,比如 IOS的Object-C,微软的COM技术(用于给window开发驱动,.net里面的技术几乎都是建立在COM上的),Python语言等.

缺陷

无法解决循环引用的问题.

这就好像是悬崖边的人采集草药的人,想要活下去就必须要有一根绳子绑在悬崖上.如果有两个人,甲的手拉着悬崖,乙的手拉着甲,那么这两个人都能活,但是,如果甲的手拉着乙,乙的手也拉着甲,虽然这两个人都认为自己被别人拉着,但是一样会掉下悬崖.

比如说 A对象的一个属性引用B,B对象的一个属性同时引用A A.b= B() B.a= A();这个A,B对象的计数器都是1,可是,如果没有其他任何地方引用A,B对象的时候,A,B对象其实在系统中是无法发挥任何作用的,既然无法发挥作用,那就应该被视作内存垃圾予以清理掉,可是因为此时A,B的计数器的值都是1,虚拟机就无法回收A,B对象,这样就会造成内存浪费,这在计算机系统中是不可容忍的.

解决办法

在语言层面处理,例如Object-C就使用强弱引用类型来解决问题.强引用计数器加1,弱引用不增加

Java中也有强弱引用

2.可达性分析算法

解释

这种算法通过一系列成为"GC Roots"的对象作为起始点,从这些节点开始向下搜索所有走过的路径成为引用链(Reference Chain),当一个对象GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达),则证明此对象是不可用的

优点

这个算法可以轻松的解决循环引用的问题

大部分的主流java虚拟机使用的都是这种算法

3. Java语言中的GC Roots

在虚拟机栈(其实是栈帧中的本地变量表)中引用的对象

在方法区中的类静态属性引用对象

在方法区中的常量引用的对象

在本地方法栈中JNI(即一般说的Native方法)的引用对象

好了,文章到此结束,希望可以帮助到大家。

java开发的方向又什么 Java软件开发方向国际班是什么意思(兰州一中国际班是什么意思)