Java的一个重要优点是通过垃圾收集器(Garbage Collection)自动管理内存的回收,程序员不需要关注它。程序员真的不需要关注内存管理吗?只要你碰到过OutOfMemoryError你就知道它不是真的。

这里我会展示如何使用VisualVM快速定位内存泄漏。先看下面这段代码:

import java.util.List;import java.util.ArrayList;public class MemoryLeakDemo {public static void main(String[] args) {new Thread(new MemoryLeak(), "MemoryLeak").start();}}class MemoryLeak implements Runnable {public static List leakList = new ArrayList();public void run() {int count = 0;while (true) {try {Thread.sleep(3);} catch (InterruptedException e) {}count++;Integer i = new Integer(count);leakList.add(i);}}}

执行下列命令:

java -verbose:gc -XX:+PrintGCDetails -Xmx20m MemoryLeakDemo

等待一段时间后,你会看到:

Exception in thread "MemoryLeak" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3181)at java.util.ArrayList.grow(ArrayList.java:261)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)at java.util.ArrayList.add(ArrayList.java:458)at MemoryLeak.run(MemoryLeakDemo.java:22)at java.lang.Thread.run(Thread.java:745)HeapPSYoungGen total 3584K, used 298K [0x00000000ff980000, 0x00000000ffe80000, 0x0000000100000000)eden space 3072K, 9% used [0x00000000ff980000,0x00000000ff9ca908,0x00000000ffc80000)from space 512K, 0% used [0x00000000ffc80000,0x00000000ffc80000,0x00000000ffd00000)to space 512K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000ffe80000)ParOldGen total 13824K, used 12156K [0x00000000fec00000, 0x00000000ff980000, 0x00000000ff980000)object space 13824K, 87% used [0x00000000fec00000,0x00000000ff7df3e8,0x00000000ff980000)Metaspace used 7993K, capacity 8164K, committed 8448K, reserved 1056768Kclass space used 912K, capacity 954K, committed 1024K, reserved 1048576K

打开VisualVM开始监测MemoryLeakDemo,在Monitor标签页我们可以看到实时的程序内存堆的使用情况:

波峰到波谷处是执行了GC的,明显可以看到执行GC后内存曲线仍旧呈上扬趋势,也就是说,内存占用是只升不降。到底是什么原因导致的呢?

打开Sampler标签页,点击Memory按钮启动一个内存分析会话,VisualVM会定期获取所有执行线程的转储,分析栈跟踪信息,实时显示成堆直方图。通过堆直方图,我们就可以知道哪个对象占用了较多的内存,以便做进一步的优化。

如上图所示,第1行的Integer对象占用内存最大,已经有41万多实例了,并且还在持续增加中。很显然,罪魁祸首就是它了!

java visualvm 内存泄露_如何使用VisualVM检测Java内存泄漏相关推荐

  1. python会不会内存泄露_总结python 三种常见的内存泄漏场景

    概要 不要以为 Python 有自动垃圾回收就不会内存泄漏,本着它有"垃圾回收"我有"垃圾代码"的精神,现在总结一下三种常见的内存泄漏场景. 无穷大导致内存泄漏 ...

  2. java 代码 内存泄露_如何用Java编写一段代码引发内存泄露

    Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中) ...

  3. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

  4. java thread 内存泄露_记一次ThreadLocal引发的内存泄露

    概念 ​首先解释下内存溢出和内存泄露的概念.内存溢出一般指的是out of memory,也就是我们经常说的OOM,常发生在堆,方法区和方法栈.内存泄露指的是一段程序在申请内存空间后,无法释放已经申请 ...

  5. Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案

    原文网址:Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java内部类持有外部类导致内存泄露的原因以及其解决方案. 为什么内部 ...

  6. 内存泄露方式有哪些和如何查询内存泄露?

    内存泄露的方式 1.查询数据库而没有关闭Cursor 在Android中,Cursor是很常用的一个对象,但在写代码是,经常会有人忘记调用close, 或者因为代码逻辑问题状况导致close未被调用. ...

  7. java 多线程 内存泄露_关于内存泄露的总结

    大致先分为五个小模块: 1.什么是内存泄漏 2.有哪些情况会导致内存泄漏切如何解决 3.如何检测内存泄漏 4.Java得基本数据类型和占用字节 5.什么是内存溢出和解决办法 一.什么是内存泄漏(Mem ...

  8. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  9. java 启动内存参数_请问该如何设置Java虚拟机JVM启动内存参数?

    jps(JVM Process Status Tool):JVM机进程状况工具 用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等.与unix上的ps类似,用 ...

  10. java 内存测试_请你说一下java jvm的内存机制

    Java虚拟机栈是线程私有的,它的生命周期与线程相同. 局部变量表存放了编译时期可知的各种基本数据类型和对象引用.局部变量表所需的内存空间在编译时期完成分配,当进入一个方法时,这个方法需要在栈帧中分配 ...

最新文章

  1. uboot启动linux,uboot中ramdisk启动linux的两种方法
  2. 在屏幕上输出你好的python语句是_编程实现:在屏幕上输出中文字符“你好,世界”。(输出结果中不带双引号)_学小易找答案...
  3. 网络通信之 字节序转换原理与网络字节序、大端和小端模式
  4. boost::fusion::make_fused用法的测试程序
  5. rust如何在木板上上传图片_通过编写一个简单的游戏来学习 Rust | Linux 中国
  6. java务必让常量的值在运行期保持不变
  7. 前端学习(2051)vue之电商管理系统电商系统之开启gzip文件传输
  8. C++ static、const和static const 以及它们的初始化
  9. 大数据可视化技术挑战和措施
  10. Mac可读可写remount硬盘
  11. 地铁译:Spark for python developers --- 搭建Spark虚拟环境 4...
  12. PHP 基于 SW-X 框架,搭建WebSocket服务器(一)
  13. python3-欢乐斗牛-实战
  14. Word标题样式关联多级列表
  15. java 日期处理_java日期处理总结
  16. CMake之add_custom_target
  17. nid java_java – jstack输出缺少tid和nid信息
  18. 简单实现小程序授权登录功能
  19. android回退页面刷新页面数据
  20. imei生成 java_Imei 生成-java版

热门文章

  1. 20200603每日一句
  2. Atitit vscode 调试php vscode使用法 目录 1. 直接debug没反应,或者打开扩展列表 1 2. 调试配置法 1 2.1. Debug》》Add cfg php 1 2.2.
  3. atitit 国家与社区发展战略研究attilax 总结 v2 .docx
  4. paip.提升性能----数据库连接池以及线程池以及对象池
  5. PAIP.WEB程序网站安全扫描检测工具(桌面程序)总结
  6. 机器学习笔记(三十):基尼系数、CART
  7. 从青铜到王者,代码人生之路 | 凌云时刻
  8. 美年健康俞熔:创业者最重要的是锻造内心、熬过拐点 | 凌云时刻
  9. 不装APP无法购物点餐开发票,这个“病”怎么治?
  10. functions.php隐藏恶意代码,警惕WordPress主题functions.php包含的恶意代码