一、从一个例子开始

  关于JVM的内存泄露,让我们从下面一个例子开始吧,大家来判断一下如果按照下面这种分配方式,会不会出现内存泄露呢?

 1 import java.util.List;
 2 import java.util.Vector;
 3
 4 public class MemoryTest {
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         Vector vobj = new Vector(10);
11         for(int i=0;i<100;i++)
12         {
13             Object obj = new Object();
14             vobj.add(obj);
15             //注意此处Java如何清除内存
16             obj = null;
17             //GC会清除这一块内存吗?
18         }
19         System.out.print("end");
20     }
21 }

以上程序不会有任何异常提示,是不是就代表没有内存泄露了呢。如果此时i最大值设为:100000000会怎么样呢?不妨自己跑一下程序,下面是我实测的结果,与具体JVM参数设置有关,各人的极限值可能不同。

1 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
2     at java.util.Arrays.copyOf(Unknown Source)
3     at java.util.Arrays.copyOf(Unknown Source)
4     at java.util.Vector.ensureCapacityHelper(Unknown Source)
5     at java.util.Vector.add(Unknown Source)
6     at MemoryTest.main(MemoryTest.java:14)

出现了内存泄露了吧。但是这种无限放大的方式,只能是事后发现,该出的事情已经出了,应经影响到了生产应用。所以事后检测于事无补。我们还需要另想办法。

二、如何判断是否出现了内存泄露

  JVM虚拟机内存的结构上一篇博客已经做了说明,只要Java堆中尚有可用空间,即使泄露也不会出现问题,除非内存空间已经超出JVM内存设置。如果没有设置内存限制,并且内存空间很大的情况下是不会出现错误提示的。这就给我带来了困扰,难道非要等内存不足,发生异常才能发现内存泄露吗?非也。

(1)代码走审:技术要求较高,纯经验法,遗漏可能性较大,可操作性较强,但一般要求互相审查。

(2)工具一 输出JDK的GC日志数据:

  设置:JAVA_OPTS增加以下参数打开jdk的GC输出日志:

  -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError

(3)jmap获得运行中的JVM内存快照:

  jmap -dump:format=b,file=jmap.hprof <PID>

(4)Eclipse Memory Analyzer:专业工具就是专业; 需要导入jmap.hprof文件,链接地址附上,详细的就不多说了,免得有做广告之嫌。

Java技术专题之JVM你的内存泄露了吗?相关推荐

  1. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  2. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题

    在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...

  3. 记一次线上JVM原生系统内存泄露排查

    目录 问题报告 应用概况 初步分析 Java堆内存,MetaSpace等使用情况 Java堆外内存分析 进程原生内存分析(Native Memory) 原生内存详细分析 内存内容分析 引入jemall ...

  4. java jstat gc_分析JVM GC及内存情况的方法

    当JVM响应变慢或者停滞的时候,我们往往需要对GC和其内存情况是进行分析,下面列举一些常用的分析方法和工具: 获得GC信息的方法 -verbose:gc -XX:+PrintGCDetails -XX ...

  5. java死锁怎么用jvm调试_jvm 内存dump、gc查看、线程死锁,jmap、jstack、jstat

    1. jstat 这个命令对于查看Jvm的堆栈信息很有用.能够查看eden,survivor,old,perm等heap的capacity,utility信息 对于查看系统是不是有能存泄漏以及参数设置 ...

  6. 【Java进阶营】Java技术专题「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  7. 【Java技术专题】「Guava技术系列」Guava-Collections实战使用相关Guava不一般的集合框架

    Google Guava Collections 使用介绍 简介 Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源 ...

  8. java设置native内存大小_如何定位native内存泄露问题?

    运行一段时间后,程序出现异常:部分操作无法进行.异常日志如下: java.lang.OutOfMemoryError: unable to create new native thread at ja ...

  9. Java内存泄露系列--内存泄露的原因及解决方案(大全)

    原文网址:Java内存泄露系列--内存泄露的原因及解决方案(大全)_IT利刃出鞘的博客-CSDN博客 简介 简介 本文介绍Java中内存泄露的一些原因与解决方案. 如果内存泄露的空间足够大,就会导致内 ...

最新文章

  1. 在maven项目中使用Junit进行单元测试(一)
  2. 函数调用的方法一共有 4 种,call,apply,bind
  3. 网摘精灵教程:网摘自动提交工具。
  4. Docker 命令自动补全必须有
  5. Maven简单的配置Junit测试及使用简单的mock
  6. java中File的使用
  7. [c++]Struct和Class的区别
  8. [蓝桥杯][2013年第四届真题]买不到的数目-模拟,数论
  9. SVDchapter14 机器学习之利用SVD简化数据
  10. 无继承情况下的对象构造
  11. Better Explained 以通俗易懂的语言阐释数学
  12. 太全面了,RF接口自动化框架项目实战
  13. input type=file 选取文件路径时出现fakepath问题IE浏览器解决办法
  14. python 会议室预约系统解决方案_会议预约管理系统解决方案
  15. BGI-College生信入门系列——3、数据库
  16. 高并发系统负载均衡与实时监控的实用方案
  17. 烟台初中计算机会考,山东烟台市2018年初中学业水平考试WORD 版有答案
  18. 服务器巡检都做什么工作,巡检的手段是什么?
  19. 计算机应用基础第五章试题及答案,计算机应用基础第五章测试题
  20. obs弹幕助手android版,obs弹幕助手

热门文章

  1. java if 没有_java – 如何做一个决定没有if语句
  2. IC/FPGA笔试/面试题分析(八)近期IC/FPGA笔试面试讨论群题目汇总解析
  3. 【 FPGA 】Xilinx FPGA器件命名意义?
  4. HAProxy客户端IP地址的透传
  5. 云计算会杀死开源吗?
  6. 实现DataGridView和DevExpress.GridControl表头全选功能
  7. 功能规格说明书Version2
  8. 安装IE8不能调试VS2005的解决办法
  9. Python编辑器与集成开发环境(IDE)选择
  10. 现场总线和工业以太网