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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值