Calendar.getInstance()内存泄露--关于Calendar.getInstance() 调用位置 对性能的影响

import java.util.Calendar;
import java.util.concurrent.atomic.AtomicLong;

public class CalendarLeakTest {
	private static Calendar cal = Calendar.getInstance();
	 
	public final static long getMsgid(long GwSeq) {
	    //函数内调用,会造成内存泄露
	    //Calendar cal = Calendar.getInstance();
	    long res = 0;
	    cal.setTimeInMillis(System.currentTimeMillis());
	    long month = cal.get(Calendar.MONTH) + 1;
	    long day = cal.get(Calendar.DAY_OF_MONTH);
	    long hour = cal.get(Calendar.HOUR_OF_DAY);
	    long minute = cal.get(Calendar.MINUTE);
	    long seconds = cal.get(Calendar.SECOND);
	    res = month << 60 | day << 55 | hour << 50 | minute << 44 | seconds << 38 | GwSeq << 16 | getMsgIdSeq();
	    return res;
	}
	 
	private static AtomicLong msgidseq = new AtomicLong(100l);
	 
	/**
	 * 自增循环使用(msgid)
	 */
	private final static long getMsgIdSeq() {
	    long next = msgidseq.incrementAndGet();
	    if (next > 65535) {
	        synchronized (msgidseq) {
	            if (msgidseq.get() > 65535) {
	                msgidseq.set(100);
	                next = msgidseq.incrementAndGet();
	            } else {
	                next = msgidseq.incrementAndGet();
	            }
	        }
	    }
	    return next;
	}
	 
	public static void main(String[] args) {
	    long start = System.currentTimeMillis();
	    for (int i = 0; i < 100000000; i++) {
	        getMsgid(123);
	    }
	    System.out.println(System.currentTimeMillis()-start+"ms");
	}
}

以上代码,alendar.getInstance() 在方法外声明创建   2核4线程 处理时间为1543ms1亿次获取。如果Calendar.getInstance() 在方法内声明,每秒处理速度为300万封顶 内存 直接上到600MB 。

 

如果Calendar.getInstance() 在方法内声明,内存会根据CPU处理速度  程直线上升 。因为每一次 调用,getInstance 都会去创建一个对象并非单例 而且 内部会创建一个int数组

在方法外声明 有一点要注意: 就是每一次都要刷新 当前时间戳 否则 时间 永远都是 第一次调用getInstance 的时间


转:https://www.jianshu.com/p/add0123faa45
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章