据我所知,没有可靠的方法可以在运行时执行此 *** 作。正如源问题中指出的那样,堆是共享资源,因此单个线程的堆大小没有意义,因为它会与其他线程的对象引用重叠。
就是说,当我确实想知道单个线程的“保留”大小,是的,保留大小与您所要求的度量标准是不同但相似的指标时,我可以通过进行堆转储然后使用MAT来实现。
(http://www.eclipse.org/mat/)。
我知道有人使用Java代理来检测对象的分配,然后使用弱引用来监视何时获得GC。但是,这样做对性能的影响很大。很高。
最好在运行时和单元测试中使用启发式方法,以确保内存保持在界限之内。例如,您可以使用JMX来监视堆大小,并且当您看到旧一代正在增长时,您可以发出警报。使用getThreadAllocatedBytes计算分配率也可能很有用。
良好的运行时间监控工具:
appdynamics,NewRelic的,VisualVM的和yourkit
对于离线内存分析,mat和jclarity非常好。
一个非常有用的工具可以帮助您发现是否存在泄漏,或者至少运行得与预期不同,它是打印当前每个类在堆上有多少实例的计数: jcmd
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)