在 Java 中, 它的内存管理包括两方面: 内存分配( 创建 Java 对象的时候)和内存回收, 这两方面工作都是由 JVM 自动完成的,降低了 Java 程序员的学习难度,避免了像 C/C++ 直接操作内存的危险。但是, 也正因为内存管理完全由 JVM 负责, 所以也使 Java 很多程序员不再关心内存分配, 导致很多程序低效, 耗内存。因此就有了 Java 程序员到最后应该去了解 JVM , 才能写出更高效, 充分利用有限的内存的程序。 在内存中的状态首先我们先写一个代码为例子: 1package test; 23import ; 45public class Person implements Serializable { 67static final long serialVersionUID =1L; 89String name; // 姓名 10 11 Person friend; // 朋友 12 13 public Person() {} 14 15 public Person(String name) { 16super (); 17this .name =name; 18 }19 } 1package test; 234public class Test{ 56public static void main(String[] args) { 7Person p1 =new Person("Kevin"); 8Person p2 =new Person("Rain"); 9Person p3 =new Person("Sunny"); 10 =p2; 12p3 =p2; 13p2 =null ; 14 }15 } 把上面 中 main 方面里面的对象引用画成一个从 main 方法开始的对象引用图的话就是这样的(顶点是对象和引用,有向边是引用关系): 当程序运行起来之后,把它在内存中的状态看成是有向图后,可以分为三种: 1) 可达状态:在一个对象创建后,有一个以上的引用变量引用它。在有向图中可以从起始顶点导航到该对象,那它就处于可达状态。 2) 可恢复状态:如果程序中某个对象不再有任何的引用变量引用它,它将先进入可恢复状态,此时从有向图的起始顶点不能再导航到该对象。在这个状态下, 系统的垃圾回收机制准备回收该对象的所占用的内存,在回收之前,系统会调用 finalize() 方法进行资源清理,如果资源整理后重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则就会进入不可达状态。 3) 不可达状态: 当对象的所有关联都被切断, 且系统调用 finalize() 方法进行资源清理后依旧没有使该对象变为可达状态, 则这个对象将永久性失去引用并且变成不可达状态, 系统才会真正的去回收该对象所占用的资源。上述三种状态的转换图如下: 对对象的 4 种引用 1) 强引用:创建一个对象并把这个对象直接赋给一个变量, eg : Person person = new Person("sunny"); 不管系统资源有么的紧张,强引用的对象都绝对不会被回收,即使他以后不会再用到。 2)
Java的内存回收机制 来自淘豆网m.daumloan.com转载请标明出处.