Java内存管理

今天看了一下java优化编程的第二章,感觉写的比较深入,几点感想,分享一下

1,Java虚拟机的内存管理机制是垃圾回收机制(Garbage Collection 简称:GC)

2,JVM管理两种类型的内存:堆内存(heap)和栈内存(stack)。堆内存用来存储程序在运行时创建或实例化的对象和变量,栈内存用来存储程序代码中声明为静态(static)的方法或者调用的非静态方法。

3,堆内存中所存储的对象可以被JVM自动回收,或者添加相关代码实现回收,不能通过其他手段来回收。

4,堆内存通常被分为两个区域:新对象(new object)区域与老对象(old boject)区域。被转入老对象区域的对象就变成了垃圾对象。JVM自动清理垃圾对象。不建议频繁强制系统垃圾回收。

5,JVM中对象的生命周期:创建阶段、应用阶段、不可视阶段、不可到达阶段、可收集阶段、终结阶段、释放阶段。

6,如果一个对象已经使用完毕,应主动将其设置为空(null),这样强制将对象置为空值,可以帮助JVM及时的发现这个垃圾对象,并且可以及时的回收该对象所占得系统资源。

7,避免在循环体中创建对象,即使对象占用内存空间不大。

//避免这样的代码
for(int i = 0; i < 10000; ++i){
Object obj = new Object();
//......
}

//使用下面的方法
Object obj = null;
for(int i = 0; i < 10000; ++i){
obj = new Object();
//......
}

8,对象创建后的应用阶段系统至少维护着所有对象的一个强引用(Strong Reference),除非显示的使用了软引用(Soft Reference)。Soft Reference的引进,使Java应用可以更好的管理内存,稳定系统,防止内存溢出,避免系统崩溃。使用如下:

import java.lang.ref.SoftReference;
//A是一个类
A a = new A();
SoftReference sr = new softRefere(a);
//这样在系统内存紧张时会释放该对象,并且能够抛出异常,但是降低系统效率和功能,有利有弊。

9,主动清除对象引用的方法,即将不用对象置为null,可以加速JVM对垃圾内存的回收,如果通过显示调用System.gc(),系统执行时间不见得会减少,存在弊端,应在必要的时候再用。如下实例:

//Test gc() java -verbosegc A
public class A{

public static void main(String[] args){
  
    for(int i = 0; i < 100000; i++){
     A a = new A();  
    a = null;  
    }
// System.gc();
    System.out.println("This is a Gc test!");  
}

}/*Output:
if have no a = null and System.gc(); the time costs is 0.0021852
if have no System.gc(); the time costs 0.0021508
if have no a = null ; the time costs 0.0021927+0.1039898
*/

10,在编译时使用命令:javac -g:none A.java,编译出来的.class文件最小。

 

参见Java 优化编程 林胜利,王坤茹 编著,电子工业出版社。

你可能感兴趣的:(java,jvm,object,null,reference)