1、垃圾回收

  垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制。

  一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收。被创建的对象不能再生,同时也没有办法通过程序语句释放它们。即当对象在JVM运行空间中无法通过根集合到达(找到)时,这个对象被称为垃圾对象。根集合是由类中的静态引用域与本地引用域组成的。JVM通过根集合索引对象。

  在做Java应用开发时经常会用到由JVM管理的两种类型的内存:堆内存和栈内存。简单来讲,堆内存主要用来存储程序在运行时创建或实例化的对象与变量。例如通过new关键字创建的对象。而栈内存则是用来存储程序代码中声明为静态或非静态的方法。

  (1)堆内存

  堆内存在JVM启动的时候被创建,堆内存中所存储的对象可以被JVM自动回收,不能通过其他外部手段回收,也是说开发人员无法通过添加相关代码的手段来回收堆内存中的对象。堆内存通常情况下被分为两个区域:新对象区域与老对象区域。

  新对象区域:又可细分为三个小区域:伊甸园区域、From区域与To区域。伊甸园区域用来保存新创建的对象,它像一个堆栈,新的对象被创建,像指向该栈的指针在增长一样,当伊甸园区域中的对象满了之后,JVM系统将要做到可达性测试,主要任务是检测有哪些对象由根集合出发是不可达的,这些对象可以被JVM回收,并且将所有的活动对象从伊甸园区域拷贝到To区域,此时一些对象将发生状态交换,有的对象从To区域被转移到From区域,此时From区域有了对象。上面对象迁移的整个过程,都是由JVM控制完成的。

  老对象区域:在老对象区域中的对象仍然会有一个较长的生命周期,大多数的JVM系统垃圾对象,都是源于“短命”对象,经过一段时间后,被转入老对象区域的对象,变成了垃圾对象。此时,它们都被打上相应的标记,JVM系统将会自动回收这些垃圾对象,建议不要频繁地强制系统作垃圾回收,这是因为JVM会利用有限的系统资源,优先完成垃圾回收工作,导致应用无法快速地响应来自用户端的请求,这样会影响系统的整体性能。

  (2)栈内存

  堆内存主要用来存储程序在运行时创建或实例化的对象与变量。例如通过new关键字创建的对象。而栈内存则是用来存储程序代码中声明为静态或非静态的方法。

  2、JVM中对象的生命周期

  在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:

  创建阶段;
  应用阶段;
  不可视阶段;
  不可到达阶段;
  可收集阶段;
  终结阶段;
  释放阶段。

  上面这7个阶段,构成了JVM中对象的完整的生命周期。

  (1)创建阶段

  在对象的创建阶段,系统主要通过下面的步骤,完成对象的创建过程:

  <1> 为对象分配存储空间;

  <2> 开始构造对象;

  <3> 从超类到子类对static成员进行初始化;

  <4> 超类成员变量按顺序初始化,递归调用超类的构造方法;

  <5> 子类成员变量按顺序初始化,子类构造方法调用。