大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
成都创新互联公司-成都网站建设公司,专注做网站、成都网站制作、网站营销推广,国际域名空间,雅安服务器托管,网站改版维护有关企业网站制作方案、改版、费用等问题,请联系成都创新互联公司。这篇文章主要介绍关于macOS上使用gperftools定位Java内存泄漏的案例分析,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一、简介
gperftools是google提供的一套分析工具,包括堆内存检测heap-profiler,内存泄漏分析工具heap-checker和CPU性能监测工具cpu-profiler。众所周知堆外内存的泄漏是很难追踪的,使用MAT等dump分析工具也只能从堆中大或者最多的对象入手去分析发生泄漏的地方。而gperftools将malloc的调用替换为它自己的tcmalloc,从而统计所有内存分配的行为,帮助我们更快的定位到发生泄漏的地方。
二、安装
直接用homebrew安装就可以了。
brew install gperftools
三、使用gperftools定位内存泄漏
1.示例程序
我们使用下面这段代码来模拟一个Native Memory泄漏的场景,这段代码使用native方法分配内存并且默认使用SoftReference持有其引用,因此如果有大量对象存活在堆中又没有触发Full GC的话就会导致他们持有的Native Memory一直不被释放,最终耗尽物理机的内存。
代码地址
public class NativeMemoryLeakDemo { public static void main(String[] args) throws IOException, FontFormatException { while (true) { test(); } } private static void test() throws IOException, FontFormatException { Resource resource = new ClassPathResource("font/font.ttf"); Font rawFont = Font.createFont(Font.TRUETYPE_FONT, resource.getFile()); Font usedFont = rawFont.deriveFont(Font.PLAIN, 30); BufferedImage bufferedImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = bufferedImage.createGraphics(); g2.setFont(usedFont); g2.drawString("hello world", 16, 35); } }