1. 垃圾回收
JVM运行环境中垃圾对象的定义:
一个对象创建后被放置在JVM的堆内存(heap)中,当永远不再引用这个对象时,它将被JVM在堆内存(heap)中回收。被创建的对象不能再生,同时也没法通过程序语句释放它们。
不可到达的对象被JVM视为垃圾对象,JVM将给这些对象打上标记,然后清扫回收它们,并将散碎的内存单元收集整合。
JVM管理的两种类型的内存:
堆内存(heap),主要存储程序在运行时创建或实例化的对象与变量。
栈内存(stack),主要存储程序代码中声明为静态(static)(或非静态)的方法。
堆内存(heap)通常情况下被分为两个区域:新对象(new object)区域与老对象(old object)区域。
新对象区域:
又可细分为Eden区域、From区域与To区域。
Eden区域保存新创建的对象。当该区域中的对象满了后,JVM系统将做可达性测试,主要任务是检测有哪些对象由根集合出发是不可到达的,这些对象就可被JVM回收,且将所有的活动对象从Eden区域拷到To区域,此时有一些对象将发生状态交换,有的对象就从To区域被转移到From区域,此时From区域就有了对象。
该过程执行期间,JVM的性能非常低下,会严重影响到正在运行的应用的性能。
老对象区域:
在老对象区域中的对象仍有一个较长的生命周期。经过一段时间后,被转入
tb老对象区域的对象就变成了垃圾对象,此时它们被打上相应的标记,JVM将自动回收它们。
建议不要频繁强制系统做垃圾回收,因为JVM会利用有限的系统资源,优先完成垃圾回收工作,致使应用无法快速响应来自用户端的请求,这样会影响系统的整体性能。
2. JVM中对象的生命周期
对象的整个生命周期大致分为7个阶段:创建(creation)、应用(using)、不可视(invisible)、不可到达(unreachable)、可收集(collected)、终结(finalized)、释放(free)。
1) 创建阶段
系统通过下面步骤,完成对象的创建:
a) 为对象分配存储空间
b) 开始构造对象
c) 递归调用其超类的构造方法
d) 进行对象实例初始化与变量初始化
e) 执行构造方法体
在创建对象时的几个关键应用规则:
避免在循环体中创建对象,即使该对象占用内存空间不大
尽量及时使对象符合垃圾回收标准
不要采用过深的继承层次
访问本地变量优于访问类中的变量