我们有一个Java ERP类型的应用程序。服务器和客户端之间的通信是通过RMI。在高峰时段,最多可以登录250个用户,其中大约20个用户同时工作。这意味着在高峰时段任何给定时间都有大约20个线程。 服务器可以运行几个小时没有任何问题,但所有突然的响应时间越来越高。响应时间可以是几分钟。
我们使用Sun的JDK 1.6.0_16在Windows 2008 R2上运行。我们一直在使用perfmon和Process Explorer来查看发生了什么。我们发现奇怪的唯一事情就是当服务器开始工作缓慢时,java.exe进程打开的句柄数量大约是3500.我不是说这是实际问题。
我只是好奇是否有一些指导方针我应该遵循以确定问题。我应该使用什么工具? ....
答案 0 :(得分:4)
您是否可以访问此应用程序的日志配置。
如果可以,您应该将日志级别更改为“DEBUG”。跟踪请求的DEBUG日志可以为您提供有关争用点的有用信息。
如果你不能,探查器工具可以帮助你:
如果已使用JMX控制点开发应用程序,则可以插入JMX查看器以获取信息...
如果您想强调应用程序触发问题(如果您想验证它是否是充电问题),您可以使用压力工具,如JMeter
答案 1 :(得分:1)
听起来像垃圾收集无法跟上并因某种原因开始“停止世界”收集。
启动时在JDK中附加jvisualvm,并在性能下降时查看收集的数据。
答案 2 :(得分:0)
你描述的问题非常典型但也很普遍。原因可能包括内存泄漏,资源争用等,以及错误的GC策略和堆/ PermGen空间分配。要指出应用程序的确切问题,您需要对其进行分析(我知道像Yourkit和JProfiler这样的工具)。如果您明智地分析您的应用程序,只有一些应用程序周期会揭示问题,否则分析本身并不容易。
答案 3 :(得分:0)
在类似的情况下,我自己编写了一个简单的分析代码。基本上我使用了一个ThreadLocal,其中包含一个“StopWatch”(基于LinkedHashMap),然后我将这样的代码插入到应用程序的各个点:watch.time("OperationX");
然后在线程完成任务后,我会调用watch.logTime();
,类会写一个如下所示的日志:[DEBUG] StopWatch time:Stuff=0, AnotherEvent=102, OperationX=150
在此之后,我编写了一个简单的解析器,从该日志生成CSV(每个代码路径)。您可以做的最好的事情是创建一个直方图(可以使用excel轻松完成)。平均值,中等和偶数模式可以欺骗你。我强烈建议你创建一个直方图。
与此直方图一起,您可以使用平均值/中等/模式创建折线图(最好代表数据,您可以从直方图中确定这一点)。
这样,您可以100%确定正在进行的操作。如果你无法确定罪魁祸首,二元搜索就是你的朋友(细粒事件)。
可能听起来很原始,但有效。此外,如果您从中创建库,则可以在任何项目中使用它。它也很酷,因为你也可以在生产中轻松打开它。
答案 4 :(得分:0)
除了其他人提到的GC之外,在减速过程中尝试每5-10秒进行一次线程转储约30秒。可能存在DB调用,Web服务或其他依赖性变慢的情况。如果你看看胎面转储,你将能够看到看起来不会移动的线,你可以通过这种方式缩小你的罪魁祸首。
从GC的角度来看,您是否在这些时间监控CPU使用情况?如果GC经常运行,您将看到整体CPU使用率的跳跃。
如果只有这是一个Solaris盒子,那么prstat就是你的朋友。
答案 5 :(得分:0)
对于像这样的急性问题,快速jstack <pid>
应该快速指出问题区域。可能没必要对它有所了解。
如果我不得不猜测,我会说Hotspot跳进来并严格优化了一些写得不好的代码。 Netbeans停止使用WeakHashMap
和新创建的对象来缓存文件数据。优化后,可以在添加条目后直接从地图中删除条目。显然,如果依赖缓存,则会跟随很多文件活动。您可能不会看到驱动器亮起,因为它将全部由操作系统缓存。