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

一、从一个例子开始

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

import java.util.List;
import java.util.Vector;

public class MemoryTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Vector vobj = new Vector(10);
        for(int i=0;i<100;i++)
        {
            Object obj = new Object();
            vobj.add(obj);
            //注意此处Java如何清除内存
            obj = null;
            //GC会清除这一块内存吗?
        }
        System.out.print("end");
    }
}

以上程序不会有任何异常提示,是不是就代表没有内存泄露了呢。如果此时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文件,链接地址附上,详细的就不多说了,免得有做广告之嫌。

时间: 2024-12-10 22:16:41

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

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

一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JVM两个子系统:类加载子系统和执行引擎子系统: 2.JVM两个组件:本地接口方法组件和内存空间组件. 2.JVM内存空间分为:Java堆,Java栈.方法区和本地方法区 关键词:我们经常讨论的JVM内存回收机制就是指Java堆内存回收机制. 四.JVM内存组成结构 上图所示四部分即为JVM内存组成结构

JAVA技术专题综述之线程篇

编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public class ThreadTest extends Thread { public void run() { for(int i=0;i<10;i++) { System.out.print(&qu

JAVA技术专题综述之内部类篇

有些类的定义中包含另一个类的定义.这种处于内部的类称为内部类(inner class). 例如: public class OuterClass { public class InnerClass { //---This is a inner class. } } InnerClass类嵌套在OuterClass中,并且被声明为public,因此被OuterClass类之外的对象访问. InnerClass类没有被声明为OuterClass类的一个静态成员,因此除非生成了一个OuterClass

JAVA技术专题综述之构造方法篇

类的继承机制使得子类可以使用父类的功能(即代码),并且子类也具有父类的类型.下面介绍类在继承关系上的初始化的顺序问题. 示例1: class SuperClass { SuperClass() { System.out.println("SuperClass constructor"); } } public class SubClass extends SuperClass { SubClass() { System.out.println("SubClass constr

Java中典型的内存泄露问题和解决方法_java

Q:在Java中怎么可以产生内存泄露?A:Java中,造成内存泄露的原因有很多种.典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况.最后会生成很多重复的对象.所有的内存泄露最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下. 复制代码 代码如下: import java.util.HashMap;import java.util.Map; public class MemoryLeak {  p

如何定位native内存泄露问题?

问题描述 环境:WinXP + SUN JDK 6.0 + RCP + AutoMan(Rational Functional Tester)问题描述: 测试人员用AutoMan(测试部自主开发的一套Java自动化测试工具,封装IBM的RFT)对RCP应用程序进行GUI自动化测试.运行一段时间后,程序出现异常:部分操作无法进行.异常日志如下:java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thr

内存泄露问题

问题描述 写贴出提示八月11,20145:09:24下午org.apache.catalina.startup.HostConfigdeployDirectory信息:DeployingwebapplicationdirectoryROOT八月11,20145:09:24下午org.apache.coyote.http11.Http11Protocolstart信息:StartingCoyoteHTTP/1.1onhttp-8888八月11,20145:09:24下午org.apache.jk.

找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题

简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能比较严重.在本文中,学习如何使用 sIEve 工具检测并解决内存泄漏问题,本文也包含内存泄漏问题的应用示例以及解决方案. 发布日期: 2012 年 4 月 09 日 级别: 中级 原创语言: 英文 访问情况 : 10932 次浏览 评论: 0 (查看 | 添加评论 - 登录)  平均分 (7个评分)

深入探索Java工作原理:JVM,内存回收及其他

Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种Web应用.同时,为了提高 Java语言的性能和健壮性,还引入了如垃圾回收机制等新功能,通过这些改进让Java具有其独特的工作原 理. 1.Java虚拟机 Java虚拟机(Java Virtual Machine,JVM)是软件模拟的计算机,它可以在任何处理器上(无论是在 计算机中还是在其他电子设备中)安全兼容地执行保存在.class文件中的字节码.Java虚拟机的"机器码 "保存在.class文件中,有时也可以