我正在解析一个相当大的(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,保留解析数据?).