java 隐式构造,java隐式创建的对象

最近发现游戏服产生了大量的Long临时对象,导致YGC的频率过高。

用Jprofiler调试了下,发现了大部分是从map的get()方法产生的(游戏里面有些线程会比较频繁的去一些map里面查询数据)

就像下面的例子:

import java.util.HashMap;

import java.util.Map;

import java.util.Timer;

import java.util.TimerTask;

public class GcTest {

public static Map map = new HashMap();

public static void main(String args[]) {

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

test1();

test2("a", "b", "c");

}

}, 100L, 100L);

}

public static void test1() {

long id = 12345678910L;

map.get(id);

System.out.println("test1");

}

public static void test2(String...params) {

System.out.println("test2");

}

}

首先map的key为Long类型,然而传给map.get()方法的参数却是普通的long,这时候java内部会先隐式的调用Long.valueOf(long),临时的产生了一个对应的Long对象,然后用它来去容器里面查询。ps:对于 -128 <= x <= 127 这种比较小的数,java本身会做缓存,不会去new 一个Long对象这个Long对象在查询完后,就没有引用了,一直呆在堆内存里,直到YGC发生时才回收

01250ca9dfce85eb558eda59782e10f0.png

5a0f9e7c6e29bd891ca7886c04d29ebe.png

同样的,jdk1.5新增的方法动态参数,也会隐式的产生一个对应的数组对象

知道了问题所在就好办了,对于我的游戏来说,比较频繁的就是根据玩家的id去查询一些信息,只要把玩家的id从long改成Long,以后所有查询都通过这个唯一的Long对象来传送参数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值