首页 > 编程知识 正文

java如何实现线程安全(java类的生命周期)

时间:2023-05-06 03:11:10 阅读:86282 作者:4730

点击上面的“java全栈技术”进行关注,每天学习一个java知识点,喜欢的人也可以关注WX号“ITeye”

在Java中,对象的生命周期由以下阶段组成:

1 .建立阶段(建立) )

2 .应用阶段(In Use )。

3 .不可见阶段(不可见) ) )。

4 .不可到达阶段(Unreachable )。

5 .收集阶段(已收集) ) ) ) ) ) )。

6 .结束阶段(完成) ) ) ) )。

7 .对象空间的再分配阶段(已分配) ) ) ) ) ) ) )。

图1.javaobject生命周期

1 .建立阶段(建立) )

在创建阶段,对象的创建过程通过以下几个步骤完成

将静态成员从对l对象分配内存空间l开始生成对象l的超类初始化到子类的l超类成员变量按顺序初始化,递归调用超类的生成方法l子类成员变量按顺序初始化,并按子类

2 .应用阶段(In Use )。

对象至少由一个强引用保留。

3 .不可见阶段(不可见) ) )。

如果对象处于不可见阶段,则程序本身没有对该对象的强引用,但这些引用仍然存在。

简单地说,程序的执行超出了该对象的范围。

如果局部变量count在25行时超出范围,则此时称为count,处于不可见阶段,如下图所示。 当然,在这种情况下,编译器会在编译过程中直接报告错误。

图2 .不可见阶段的示例

4 .不可到达阶段(Unreachable )。

对象处于无法到达的阶段意味着该对象不再由强引用保留。

与“不可见阶段”相比,“不可见阶段”意味着程序不再具有对该对象的强引用。 即使在这种情况下,该对象也可能由系统(如JVM )中加载的静态变量或强引用(如线程或JNI )保留,这些特殊的强引用称为“GC root”。 这些GC root会导致对象的内存泄漏,无法回收。

5 .收集阶段(已收集) ) ) ) ) ) )。

当垃圾收集器发现对象已经处于无法到达的阶段,并且垃圾收集器准备重新分配对象的内存空间时,垃圾收集器将进入“收集阶段”。 如果对象已经重写了finalize ()方法,则执行该方法的终端操作。

在此特别说明。 不要重载finazlie ()方法! 原因有两个:

分配影响LJVM的对象和回收速度对象时,JVM必须在垃圾收集器中注册对象,以便在回收时执行重载方法。 方法运行时需要CPU时间,然后在方法运行后重新运行。 这意味着垃圾收集器必须对对象至少执行两次GC操作。

l在该对象可能再次“复活”的finalize () )方法中,如果另一个强引用再次拥有该对象,则对象的状态将从“收集阶段”恢复为“应用阶段”。 这个Java对象的生命周期进程被破坏,“复活”的对象不利用后续的代码管理。

6 .结束阶段

如果对象在执行finalize ()方法后仍处于无法到达的状态,则该对象将进入结束阶段。 在这个阶段,等待垃圾回收器回收其对象空间。

7 .对象空间的再分配阶段

如果垃圾收集器回收或重新分配了该对象所占用的内存空间,则该对象将完全消失,称为“对象空间重新分配阶段”。

译文: https://博客. csdn.net/so dino/article/details/38387049

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。