java – 如何避免string.intern()争用并保持较低的内存占用?

我正在解析一个相当大的(200 MB)XML文件,它导致一个对象树,每个对象都定义了一堆参数(key = value).此数据结构在Tomcat webapp中运行,用于查找这些参数.

几个月前,我们在此服务器上发现了堆内存问题.我们可以通过实现参数键和值(大多数是非常冗余的)来实现它,从而将内存占用从150 MB减少到20 MB.

今天我正在重新访问服务器,因为人们抱怨启动时间.我正在分析服务器并发现使用XPP3解析XML需要40秒,其中String.intern()需要超过30秒.

我知道这是一个权衡.我知道我可以自己做实习.由于解析XML是单线程的,因为简单的HashMap也可以完成这项工作.但是你知道,这有点奇怪.

是否有人关注数字以确定是否值得将String.intern放入支持不同的解决方案?

那么问题是?如何才能在这些问题上获得尽可能低的争用?

谢谢,
斯特凡

解决方法:

添加一个额外的间接步骤:使用第二个HashMap保存密钥,并在将密钥插入内存结构之前先查找密钥.这将比String #intern()提供更多的灵活性.

但是,如果你需要在每个tomcat启动时解析那个200MB的XML文件,并且额外的10秒让人们抱怨(他们经常重启tomcat吗?) – 这会使标志弹出(你考虑使用数据库,甚至是Apache) Derby,保留解析数据?).

上一篇:【MOS】Troubleshooting 'enq: TX - index contention' Waits (文档 ID 873243.1)


下一篇:C++多线程库的常用函数 std::lock()