第五条-消除过期的对象引用

原创 2012年03月30日 16:59:46

 

package EffectiveJava;

import java.util.Calendar;
import java.util.Date;

public class _2_4 {
	private final Date birthday;
	private static final Date start;
	private static final Date end;
	private  transient Date s = null;
	private transient  Date e = null;
	public _2_4(Date birthday) {
		this.birthday = birthday;
	}
	static {  // 将这个方法写在静态区域块中,这样只需生成一个对象实例,大大提高了效率,但附加的对象貌似太臃肿,如果方法一次都不调用的话,这里初始值就是浪费了
		Calendar cale = Calendar.getInstance();
		cale.set(1946, Calendar.JANUARY, 1, 0, 0);
		start = cale.getTime();
		cale.set(1965,Calendar.JANUARY,1,0,0);
		end = cale.getTime();
	}
	public boolean isBaby() { // 些方法每次被调用的时候都会生成一个Calendar 对象,而执行完方法后又迅速被垃圾收集机制回收,所以效率很慢
		Calendar cale = Calendar.getInstance(); 
		cale.set(1946, Calendar.JANUARY, 1, 0, 0);
		Date start = cale.getTime();
		cale.set(1965,Calendar.JANUARY,1,0,0);
		Date end = cale.getTime();
		return birthday.compareTo(start)>0&&birthday.compareTo(end)<0;
	}
	public boolean bisBaby() { // 这是第三个方法,仿照的 hashmap 中的 keyset,定义两个临时变量 ,如果变量为空,则初始化,如果不为空,则不要初始化
		return this.birthday.compareTo(start)>0&&birthday.compareTo(end)<0;
	}
	public boolean cisBaby() {
		if(s==null || e ==null)
		{
			Calendar cale = Calendar.getInstance();
			cale.set(1946, Calendar.JANUARY, 1, 0, 0);
			this.s = cale.getTime();
			cale.set(1965,Calendar.JANUARY,1,0,0);
			this.e = cale.getTime();
		}
		return s.compareTo(birthday)>0&&e.compareTo(birthday)<0;
	}
	public static void main(String args[]) {
		
		_2_4 person = new _2_4(Calendar.getInstance().getTime());
		long begin = System.currentTimeMillis();
		for(int i=0;i<1000000;i++) {
			person.bisBaby();
		//	person.isBaby();
			person.cisBaby();
		}
		long end = System.currentTimeMillis();
		System.out.println(((double)end-begin)/1000+" s");//3.359 s  0.016 s
			
	}
	
}

第6条:消除过期的引用对象

在像JAVA这种
  • u014723123
  • u014723123
  • 2014年06月22日 14:28
  • 726

第6条 创建和销毁对象——消除过期的对象引用

1、如果一个栈先是增长,然后再收缩,那么从栈中弹出来的对象将不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,它们也不会被回收。这是因为,栈内部维护着对这些对象的过期引用。所谓的过期引用是指永远不...
  • Xi__Yuan
  • Xi__Yuan
  • 2016年05月03日 15:01
  • 458

高效Java06:消除过期的对象引用

类自己管理内存一般而言,只要是类自己管理内存,我们就应该警惕内存泄漏问题。比如下面的例子:public class Stack { private Object[] elements; ...
  • digvwell
  • digvwell
  • 2017年03月20日 23:03
  • 152

Java性能优化(5):消除过期的对象引用

当你从一种手工管理内存的语言(比如C/C++)转换到一种具有垃圾回收功能的语言的时候,作为一个苦逼的程序猿,工作这时候变得更加容易。因为当你用完了对象后,它们会自动被回收(现实中的对象可不能这样啊(ฅ...
  • pangjiuzala
  • pangjiuzala
  • 2015年08月20日 15:52
  • 1619

消除过期的对象引用

一、JVM中的垃圾回收机制虽然会自动回收不再使用的对象,但是其回收机制是有前提的条件的,违背了中前提条件一般就会出现内存泄漏。而处于内存泄漏的对象特点如下: 1、对象可达,即该对象还存在,还可以被访问...
  • tscyds
  • tscyds
  • 2016年04月25日 00:05
  • 564

第6条:消除过期的对象引用

第6条:消除过期的对象引用    当我们从运用手工管理内存的语言时(例如C或者C++)转换到具有垃圾回收功能语言的时候,程序员的工作会变得更高价容易,因为当用完一个对象之后,它们在之后的时间会被自动回...
  • Jing_Unique_Da
  • Jing_Unique_Da
  • 2015年11月11日 13:24
  • 632

(6):消除过期的对象引用

java有自己的垃圾回收功能,这大大减少了程序员的负担。但对于有些被引用的对象,即使我们之后再也不使用它,它也不会被回收,这就是所谓的内存泄漏。 下面是一个简单的栈实现例子: public class...
  • ahui2333
  • ahui2333
  • 2017年03月30日 10:25
  • 146

6.消除过期对象的引用

内存泄漏的问题(有一个HEAD PROFITER的工具可以检测内存泄漏问题)这部分的内容理解的还不是很透彻. 只要类是自己管理内存,程序员就应该警惕内存泄漏的问题() - 缓存问题(可以用W...
  • y41992910
  • y41992910
  • 2016年12月22日 10:43
  • 113

06-消除过期的对象引用

java 虽然有垃圾回收机制,但是对于被引用的对象,就算我们已经不再使用,它的回收机制可能也不会进行回收,称之为内存泄漏。书中有这样一个例子,先看代码:public class Stack { ...
  • plain_maple
  • plain_maple
  • 2017年02月15日 22:15
  • 197

第6条:消除过期的对象引用

第6条:消除过期的对象引用Java语言相较于C与C++一个非常大的区别便是具有自动垃圾回收的功能。而这有时会给我们一个错觉,那就是不需要再考虑内存管理这方面的事情了,这种看法明显是错误的,比如下面这段...
  • jh352160
  • jh352160
  • 2017年03月15日 11:46
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第五条-消除过期的对象引用
举报原因:
原因补充:

(最多只允许输入30个字)