`

转:并非非常完美 发现Java虚拟机内存泄露问题

    博客分类:
  • java
 
阅读更多

并非非常完美 发现Java虚拟机内存泄露问题

2010-06-01 10:09作者:天极网开发频道出处:天极网软件频道责任编辑:郑重

 
 

常规理解上,Java的内存管理机制是将局部变量保存在堆中,当变量的作用域结束之后,该变量所占用的内容会被自动回收。不需要做任何特殊的处理。比如下面的代码:

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.         byte[] data2 = new byte[dataSize];  
  8.     }  
  9.  
  10.     public static void main(String[] args) {  
  11.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  12.         jmp.f();  
  13.     }  

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

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

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

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.             data1 = null;  
  7.         }  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  

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

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.     int i=1;  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  
分享到:
评论

相关推荐

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...

    解决java虚拟机内存不足问题

    解决java虚拟机内存不足问题,简单快捷

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java...总的来说,深入理解Java虚拟机内存模型有助于我们更好地设计和优化Java应用程序,避免因内存问题导致的性能瓶颈或系统崩溃。通过学习和实践,我们可以编写出更高效、更稳定的代码。

    Java虚拟机内存管理总结

    Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型...

    Java虚拟机规范.Java SE 8版.zip

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...

    深入java虚拟机.pdf

    Java 虚拟机的垃圾收集是指在 Java 虚拟机中自动地回收不再使用的对象,以释放内存空间。垃圾收集可以是周期性的,也可以是根据需要进行的。Java 虚拟机提供了多种垃圾收集算法,如标记-清除算法、复制算法、标记-...

    完善解决个人网上银行不能登录的问题2:安装SUN公司的JAVA虚拟机

    完善补充解决个人网上银行不能登录的问题2:安装SUN公司的JAVA虚拟机 问题的具体表现为 “网页错误 详细信息为:显示对象不支持此属性和方法”

    读书笔记:学习代码深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明.zip

    读书笔记:学习代码深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明

    Java虚拟机内存区域模型

    Java虚拟机内存区域的管理是Java开发中最重要的内容之一,对于Java开发者来说,了解Java虚拟机内存区域模型是非常必要的。只有了解了Java虚拟机内存区域模型,才能更好地编写高效、可靠的Java程序。 程序计数器是...

    java虚拟机的内存结构

    java虚拟机的内存结构,关于内存的相关介绍等,想要了解更多JVM的

    基于Java虚拟机内存模型的性能调优方法.zip

    - **新生代与老年代**:Java内存分为新生代和老年代,新生代用于存放新创建的对象,老年代则存放生命周期较长的对象。通过调整新生代和老年代的比例,可以优化垃圾回收性能。 - **G1垃圾收集器**:G1是一种并行、...

    JAVA虚拟机的内存管理

    ### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...

    java虚拟机规范(java SE7)

    第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化

    Java虚拟机规范.Java SE 8版

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...

    java虚拟机

    6. **JVM内存模型**:Java内存模型(JMM,Java Memory Model)定义了线程如何访问和修改共享变量,以及如何保证内存可见性和一致性。 7. **异常处理与线程**:JVM支持多线程,每个线程有自己的虚拟机栈和程序计数器...

    Java运行原理与Java虚拟机.pdf

    1. **编译阶段**:Java源代码(.java)文件首先通过Java编译器(javac)被编译成字节码文件(.class),这些字节码是一种中间代码,并非直接可执行的机器码。字节码的设计确保了其与平台无关性,因为它们不包含任何特定...

    支持复合对象的Java虚拟机内存管理技术研究.pdf

    关键词:Java虚拟机、复合对象、内存管理、CAR组件 知识点: 1. 面向对象系统的基本概念:对象、类、继承等 2. Java虚拟机的内存管理机制:对象的创建、管理和销毁 3. 复合对象的概念:具有相同特性和行为的对象...

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

    Java虚拟机(JVM)内存管理是Java开发技术中的一个重要组成部分,它涉及了垃圾回收机制、内存泄漏问题以及内存分配策略等多个方面。在Java虚拟机内存管理中,垃圾回收机制的存在经常被初级程序员所忽略,因为它自动...

Global site tag (gtag.js) - Google Analytics