问题描述
我写了一个处理HTML的小程序,用了neko库,生成Document对象后做分析处理。整个程序在Windows下运行一切OK,到了Linux服务器上,却在提取URL时特别卡(比某些贴子里提到的1:10还夸张,要卡老半天)。URL的提取我先是用的getElementsByTagName('A'),后面怀疑当A标签多达上千个时这个方法是不是有性能问题,就改成了遍历,结果还是一样的。但也不一定是这一句本身卡住。提取出来的URL生成java.net.URL对像,放在一个Set里。怀疑过Set过大内存不足,但我一来试过启动时加大内存,二来我把程序改成了每一百个就提交一次并清空Set,都不见效果。这个小程序没有多线程(neko 包里有没有不清楚,但似乎它的工作完成的比较顺利,应该与它无关)。Linux环境为CentOS 5 64bit, Sun JDK 1.6, SELinux Permit, Tomcat运行良好。看别人有因为系统自带了 JDK 1.4且默认用了这个导致速度很慢的,我的系统里找不到其它JDK,java -version也是正确的。请高手们给个思路吧,我也计划找个性能分析工具看看更具体的东西。只是这么个小程序,居然弄到这么麻烦…… 问题补充:资源占用没什么,不过椎栈追踪提醒了我。初步怀疑每个java.net.URL对象创建时(或hashCode时?)都会去getHostAddress,大量解析Host名称致使速度变慢。不知是否真是这样。我还在Googling,大家如有比较了解的,欢迎并感谢告知。若果真如此,这个东西难道Linux下的解析速度远低于Windows?还是Windows直接偷懒了呢?
解决方案
直接用JDK自带的JCONSOLE看看
解决方案二:
使用Yourkit,非常方便。
解决方案三:
JDK的bin目录下有个jconsole可以查看JVM运行时的状况。windows下的话,除了这个还有个jvisualvm.exe更清楚点。