Websphere系统hang原因调查

本文详细分析了在使用IBM JDK时,ArrayList的初始化长度限制导致的问题,以及如何解决该问题,包括核心原因、解决方法和相关测试验证。

某个系统使用openjpa 作为持久层,对一些native query,openjpa返回的result size返回的是int最大值2147483647,让人很受伤。旧的代码为了得到实际result长度,通常在持久层对result list做一次遍历操作,把所有对象放到新的ArrayList中返回。最近一次功能扩展,对返回的result list直接使用toArray放到新的list当中返回,本地测试没有问题,去到服务器Websphere上面就挂了,系统卡死在调用新持久层函数的地方,不知道为什么。我先去系统监控中查看了CPU,内存,网络使用情况,发现内核使用CPU的时间明显变长
这里写图片描述
接下来要求系统环境维护人员帮忙对出问题的JVM进行了core dump和heap dump,用ibm thread analyzer hca456.jar对core dump进行分析,发现系统停在了ArrayList的初始化地方
这里写图片描述
很明显,系统是死在了toArray的实现上了,对Integer最大长度的Array在进行拷贝操作,系统CPU使用时长增加。
在oracle的jdk中,toArray的拷贝长度取决于内部array的length,所以虽然result list size返回的是Integer的最大值,但是不影响toArray的实现,IBM的JDK实现不一样,结果就中招了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值