内存管理的目的:
Java语言的性能极大程度上依赖于其运行的硬件环境,而内存又是硬件环境资源的一部分。如果Java开发人员开发的应用没能合理、有效地使用系统内存,那么这个应用就不可能具备高的性能,甚至会导致系统运行期间崩溃。
谈及Java内存管理,首先应该清楚两个概念:Java对象的生命周期和垃圾回收机制(Garbage Collection ,GC)。
Java对象生命周期
Java对象的生命周期是指对象从创建到回收的整个生命历程,共包括7个阶段,创建阶段(create)、应用阶段(using)、不可视阶段(invsiable)、不可达阶段(unreachable)、可搜集阶段(collection)、终结阶段(finalized)、释放阶段(free)。
-
创建阶段。在创建阶段,系统会经历以下5个步骤:
1)为对象分配存储空间
2)开始构造对象
3)递归调用其超类的构造方法
4)进行对象实例初始化及变量初始化
5)执行构造方法体
2、以上是系统处于创建阶段时,系统所做的一些工作。其中有些过程与应用的性能密切相关。创建对象时的关键应用规则:
1)避免在循环体中声明创建对象;(这样会在内存中产生大量的对象应用)
2)尽量及时使对象符合垃圾回收标准
3)不要采用过深的继承层
4) 访问本地变量由于访问类的变量
3、应用阶段。对象的“价值存在期”,这一时期对象具有以下特征:
1)系统至少维护着对象的一个强引用;
2)所有对该对象的引用全部是强引用
4、不可视阶段。在应用阶段之后便是不可视阶段,说明我们在其他区域的代码中已经不可以在引用它,其强引用已经消失。
5、不可达阶段。处于不可达阶段的对象,在虚拟机所管理的对象引用根集合中在也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载类的静态变量或者对本地代码接口(JNI)的引用。
6、可收集阶段、终结阶段与释放阶段
当对象处于这个阶段可能处于下面三种情况:
1)回收器发现该对象不可达;
2)finalize方法已经被执行
3)对象空间已被重用
垃圾回收机制
Java虚拟机的内存管理机制叫做垃圾回收机制(GC)。
Java中垃圾对象的定义:
一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收。被创建的对象不能再生,同时也没有办法通过程序语句释放他们。
另一个定义:
当对象在JAVA运行空间中无法通过根集合(root set)到达时,这个对象就被称为垃圾对象。根集合是由类中的静态引用域与本地引用域组成的,JVM通过根集合索引对象。
在做Java应用开发时,经常会用到由JVM管理的两种类型的内存:堆内存(heap)和栈内存(stack)。
堆内存主要用来存储程序在运行时创建或实例化的对象和变量。
堆内存在JVM启动时就被创建,是JVM内存管理中非常关键的一个内存管理区域。堆内存中所存储的对象可以被JVM自动回收,不能通过其他外部手段回收。堆内存通常分为两个区域:新对象区域和老对象区域。
新对象区域又可以分为三个小区域:Eden区域、From区域、To区域。Eden区域用来保存新创建的对象,当Eden区域的对象满了之后,JVM将要做可到达性测试,主要任务是检查哪些对象由根集合出发不可到达。这些对象就可以被JVM回收,并且将所有的活动对象从Eden区域拷到To区域,此时一些对象将发生状态交换,有些对象就从To区域转移到From区域,此时From区域就有了对象。整个的对象迁移过程是由JVM控制完成的。这一过程会严重影响应用的性能。
老对象区域,在老对象区域的对象仍有一个较长的生命周期,大多数的JVM系统中的垃圾对象,都来自于“短命对象“,经过一段时间被转入老对象区域的对象,就变成了垃圾对象。
栈内存主要用来存储程序代码中声明为静态或非静态的方法。
垃圾回收与对象的生命周期,密的联系在一起。