`
dimpen
  • 浏览: 24538 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Java虚拟机内存泄露问题(摘)

阅读更多
Java的内存管理机制是将局部变量保存在堆中,当变量的作用域结束之后,该变量所占用的内容会被自动回收。比如下面的代码:

public class JavaMemory{
   private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);
   public void f(){
    {
       byte[] data1 = new byte[dataSize];
    }
     byte[] data2 = new byte[dataSize];
   }

   public static void main(String[] args) {
     JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();
     jmp.f();
   }
}

在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。

如果我们实际执行这个例子,会发现出现了 java.lang.OutOfMemoryError错误。这是为什么?如果在BEA或者IBM的虚拟机上测试过这个例子,并不会出现错误。也就是说,SUN的JVM在内存回收机制上存在漏洞或者BUG。

这个问题该如何修正呢,方法其实很简单。只需要在变量作用域结束之前,将变量置为空就可以了。修改之后的结果如下:

public class JavaMemory{
   private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);
   public void f(){
    {
      byte[] data1 = new byte[dataSize];
      data1 = null;
    }
     byte[] data2 = new byte[dataSize];
   }

   public static void main(String[] args) {
     JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();
   jmp.f();
   }
}

发现这个问题,对于Java开发者来说也许会很紧张,担心自己的代码是否会出现同样问题。大家尽可放心,连续出现两个变量占用内存之和超过内存限制的情况概率非常小。并且在两个变量之间,如果定义了其他变量也不会出现这个问题。如下面的代码就不会出现问题:

public class JavaMemory{
   private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);
   public void f(){
    {
      byte[] data1 = new byte[dataSize];
    }
     int i=1;
     byte[] data2 = new byte[dataSize];
   }

   public static void main(String[] args) {
     JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();
     jmp.f();
   }
}

分享到:
评论

相关推荐

    Java虚拟机内存管理与内存泄漏.zip

    Java虚拟机内存管理与内存泄漏

    Java虚拟机内存管理与内存泄漏.pdf

    Java虚拟机内存管理与内存泄漏.pdf

    Java虚拟机内存优化实践

    前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,不得不说到内存泄露。众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾...

    深入理解Java虚拟机精华知识点

    其次,它提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题。 从架构角度来看,Java虚拟机主要包括类加载器、运行时数据区、执行引擎、垃圾收集器等部分。类加载器负责将字节码文件...

    Java虚拟机内存溢出与内存泄漏

    主要介绍了Java虚拟机内存溢出与内存泄漏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java虚拟机内存溢出及泄漏实例

    本篇文章给大家分享了java虚拟机内存溢出及泄漏的实例以及相关知识点分享,有兴趣的朋友参考学习下。

    java内存泄露深度分析及解决

    尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。的确,在大型工程中,内存泄漏是一个普遍问题。避免内存泄漏的第一步,就是要了解他们发生的原因。这篇文章就是...

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!)

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!) 文章目录Java内存模型我们开发人员编写的Java代码是怎么让电脑认识的为什么说java是跨平台语言Jdk和Jre和JVM的区别说一下 JVM由那些部分组成,运行流程是什么...

    JAVA虚拟机原理

    概括地说,该机制对JVM(JavaVirtualMachine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(NerverStop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。...

    Java内存模型详解JMM.docx

    防止内存泄漏是JMM中的一个重要概念,它是指在Java虚拟机中避免内存泄漏的方法。防止内存泄漏是JMM中的一个重要组成部分,它们之间的关系非常重要。 JMM是Java语言规范中的一部分,它描述了程序中各个变量之间的...

    java内存分配 内存泄漏

    关于java内存分配的讲述。JAVA 文件编译执行与虚拟机(JVM)介绍

    java典型的内存泄漏

    该文档是著名大师Staffan Larsen写的,他是JRockit项目的工程师之一,这个项目是...java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。该文档分析的JAVA内存泄漏的原因。

    javacore和dump分析工具

    这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    2. 程序不严密,产生太多的垃圾:程序中的死循环、无限循环、内存泄露等问题都会导致垃圾的积累,从而导致内存溢出。 解决方法 调整 JVM 的堆大小 1. 使用 `-Xmx` 参数增加堆的最大使用内存:可以在启动 JVM 时...

    JVM内存问题最佳实践

    如何选择合适的Java虚拟机 了解Java基本内存管理基本概念 了解发生内存不足/内存泄漏错误的原因和症状 了解如何诊断内存不足/内存泄漏错误 了解如何解决内存不足/内存泄漏错

    性能测试总结之内存泄露和内存溢出

    下面就开始本篇的内容:第一部分概念众所周知,java中的内存java虚拟机自己去管理的,他不想C++需要自己去释放。笼统地去讲,java的内存分配分为两个部分,一个是数据堆,一个是栈。程序在运行的时候一般分配数据堆...

    Java常见面试问题整理.docx

    在1.8之后,由于永久代内存经常不够用或发生内存泄露,爆出异常OOM,所以在1.8之后废弃永久代,引入元空间的概念。元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。 直接内存:不受JVM ...

    Java虚拟机筑地篇之垃圾收集算法

    上一篇介绍了Java虚拟机的运行时内存区域,接下来将来学习下几种常见的垃圾收集算法,进入正题。 概述 在早期,人们就在思考GC(Garbage Collection,GC)需要完成的三件事: 哪些内存需要回收? 什么时候回收? ...

Global site tag (gtag.js) - Google Analytics