根据我的理解,Java线程转储是所有线程的转储,这些线程描述JVM中每个线程在特定时间点所做的事情或每个线程的状态。类似地,内存转储表示特定时间点的内存健康状况。
是否有任何工具提供了一种方法来获取一个小时或更长时间的内存或线程转储,这样如果我想分析一个小时的状态,我就可以这样做了吗?
在j控制台、jvisualvm或dynatrace中,我看不到任何方法。也许有办法但我找不到?
发布于 2015-12-10 14:42:21
至于内存转储:定期转储内存将需要一个非常非常大和非常非常快的文件系统。所以不,我不建议你这么做。最好基于gc活动或其他条件定义一些触发器。
关于堆栈-跟踪:如果您面临竞争条件,您的阶段(严重多线程?)对于所有用户,应用程序都会冻结或减慢,我发现收集几个(3-5)线程转储的时间间隔为3到5秒是有帮助的(我们从5分钟开始,随着系统变得更加稳定,将其削减到30米),然后比较这些快照,识别可能的干扰。
虽然第一次迭代涉及j堆栈,但它后来演变为基于JMX的对java应用程序的访问,并同时提取数据库锁信息。
所以你的问题可以诚恳地回答:“视情况而定”。只有当您看到OutOfMemoryErrors时,才应该提取内存转储。当可能出现高流量/冻结/线程阻塞时,线程转储可能是有用的。
发布于 2015-12-10 13:20:32
如果您希望定期转储内存/线程状态,我不知道有任何工具可以这样做,但是编写自己的实现应该非常容易。
对于线程转储,可以使用J堆栈,对堆转储使用杰特。两者都是标准JDK的一部分。
请记住,保存大量堆转储会很容易地耗尽所有磁盘内存。此外,我也不确定线程转储在很长一段时间内是否有用。据我所知,它们经常用于在特定的时间范围内检查堆栈,以查找错误/死锁等。
发布于 2015-12-10 13:32:24
您可以使用Javamelody,但是需要将它“添加”到应用程序中。
https://github.com/javamelody/javamelody/
它允许您监视应用程序,查看历史记录,以及生成转储(但我认为它不能在过去的两个事件之间提供转储)。
https://stackoverflow.com/questions/34202515
复制相似问题