`

转:并非非常完美 发现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 VM) msjavax86 微软java虚拟机

    垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点代码编译成本地机器码,提升运行效率。 总的来说,Java虚拟机是Java生态系统中的关键组件,它使得Java程序能够在...

    Java虚拟机规范 Java SE 8版-带目录-pdf

    Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...

    Java虚拟机规范.Java SE 8版

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

    Java虚拟机规范(中文版) Java SE 7

    - **垃圾回收机制**:垃圾回收是Java虚拟机的一项重要功能,用于自动管理内存,避免程序出现内存泄漏等问题。规范详细介绍了垃圾回收的基本原理和算法。 #### 结论 《Java虚拟机规范(Java SE 7版)》是Java开发者...

    java虚拟机

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

    自己动手写Java虚拟机 (Java核心技术系列)@

    Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的...

Global site tag (gtag.js) - Google Analytics