Effective java-对象的建立和销毁

说到java对象的建立,首先应该提下java的内存机制,最主要的两块应该就是堆内存和栈内存。java

简单点来讲栈内存主要是保存基本数据类型的值和保存引用变量,堆内存主要用来存放new产生的对象,数组。数据库

堆是被全部线程共享的一块内存区域,在虚拟机启动的时候被建立。个人理解就是堆是用来存放实实在在东西的,而栈只是用来存放一个编号的。数组

比如你是个真实存在的人(编号9527,这个就是那些栈中引用指向的地方),你就是放在堆中,你的名字叫张三,而这个张三是放在栈中一个引用变量,你也能够有一个小名叫李二狗,这个李二狗和张三都是指向堆中9527这个对象。安全

其次还有方法区。方法区用来存放已被加载的类的信息、常量、静态变量。常量池是在方法区中而不是堆内存中,”AAA“字符串是在常量池的 ,new String(”AAA“),会在常量建立一个”AAA“字符串,还会在堆中建立一个字符串对象。jvm

 

对象的建立:工具

1.避免建立没必要要的对象,避免在方法内部建立对象,由于若是在方法内部建立对象XX xxx = new XXX();不考虑线程安全的条件下若是有N个线程调用该方法,那么就会建立N个XXX对象。线程

2.考虑使用单例模式对象

3.一些不须要改变的工具类可使用static静态代码块来初始化。private static final XXX xxx;static {xxx = new XXX();},首先static 修饰的字段是属于类的,全部对象均可以使用,其次静态代码块只会在类加载的时候初始化一次也就只会建立一个XXX对象。内存

4.尽可能使用基础数据类型,避免使用包装类,一是拆箱装箱耗时,二是对象比基础数据更占内存。能够试试:Long sum = 0L;for(int i = 0;i<Integer.MAX_VALUE;i++){sum += i;},将sum的生命改为基础数据类型long再试试。资源

对象的销毁:java中若是一个栈先增加,再收缩,那么从栈中弹出来的对象不会被看成垃圾回收,即便栈中已经再也不引用这些对象。由于栈中还维护对这些对象的过时引用(永远也不会再被解除的引用)

1.某些状况下,能够考虑将某些引用置空告诉jvm这个对象已经没有引用了;即便后面再有使用也会抛出空异常,很快即可以发现问题。

2.避免调用finalizer 方法,子类若是重写该方法清除一些资源,切记在重写方法中还要手动调用父类的该方法super.finalizer ();并且最好是在finally中调用,保证无论发生什么异常父类的finalizer 方法都会执行

3.能够考虑提供一些清理资源的方法。好比io流相关类都提供close方法,数据库链接Connection也有close关闭链接

相关文章
相关标签/搜索