疯狂JAVA16课——读书笔记(第四课)

1、程序员需要通过关键字new创建Java对象,即可视作为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间;当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除它们,并回收它们所占用的内存空间。

2、当JAVA对象被创建出来之后,垃圾回收机制会实时地监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当垃圾回收机制实时地监控到某个对象不再被引用变量所引用时,垃圾回收机制就会回收它所占用的空间

3、可以把JVM内存中对象引用理解成一种有向图,把引用变量、对象都当成有向图的顶点,将引用关系当成图的有向边,有向边总是从引用端指向被引用的Java对象。因为Java所有对象都是由一条一条线程创建出来的,因此可把线程对象当成有向图的起始顶点。

4、对于单线程程序而言,整个程序只有一条main线程,那么该图就是以main线程为顶点的有向图。在这个有向图中,main顶点可达的对象都处于可达状态,垃圾回收机制不会回收它们;如果某个对象在这个有向图中处于不可达状态,那么就认为这个对象不再被引用,接下来垃圾回收机制就会主动回收它了。

5、JVM的垃圾回收机制采用有向图方式来管理内存中的对象,因此可以方便地解决循环引用的问题。例如,有3个对象相互引用,A对象引用B对象,B对象引用C对象,C对象又引用A对象,它们都没有失去引用,但只要从有向图的起始顶点(也就是线程跟)不可到达它们,垃圾回收机制就会回收它们。采用有向图来管理内存中的对象具有高的精度,但缺点是效率较低。

6、当一个对象在堆内存中运行时,根据它在对应有向图中的状态,可以把它所处的状态分为以下3种:

     ①可达状态:当一个对象被创建后,有一个以上的引用变量引用它。在有向图中可从起始顶点导航到该对象,那它就处于可达状态,程序可通过引用变量来调用该对象的属性 或方法。

     ②可恢复对象:如果程序中某个对象不再有任何引用变量引用它,它将先进入可恢复状态,此时从有向图的起始顶点不能导航到该对象。在这个状态下,系统的垃圾回收机制准备回收该对象所占用的内存。在回收该对象之前,系统会调用可恢复状态的对象的finalize方法进行资源清理,如果系统再调用finalize方法重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则,该对象将进入不可达状态。

         ③不可达状态:当对象的所有关联都被切断,且系统调用所有对象的finalize方法依然没有使该对象变成可达状态,那这个对象将永久性地失去引用,最后变成不可达状态。只有当一个对象处于不可达状态时,系统才会真正回收该对象所占用的资源。

7、一个对象可以被一个方法的局部变量所引用,也可以被其他类的类变量引用,或者被其他对象的实例变量引用。当某个对象被其他类的类变量引用时,只有该类被销毁后,该对象才会进入可恢复状态;当某个对象被其他对象的实例变量引用时,只有当引用该对象的对象被销毁或变成不可达状态后,该对象才会进入不可达状态。

你可能感兴趣的:(jvm,虚拟机,垃圾回收,内存)