并非非常完美 发现Java虚拟机内存泄露问题
2010-06-01 10:09作者:天极网开发频道出处:天极网软件频道责任编辑:郑重
常规理解上,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();
- }
- }
相关推荐
第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...
解决java虚拟机内存不足问题,简单快捷
Java虚拟机(JVM)内存模型是Java...总的来说,深入理解Java虚拟机内存模型有助于我们更好地设计和优化Java应用程序,避免因内存问题导致的性能瓶颈或系统崩溃。通过学习和实践,我们可以编写出更高效、更稳定的代码。
Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型...
《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...
Java 虚拟机的垃圾收集是指在 Java 虚拟机中自动地回收不再使用的对象,以释放内存空间。垃圾收集可以是周期性的,也可以是根据需要进行的。Java 虚拟机提供了多种垃圾收集算法,如标记-清除算法、复制算法、标记-...
完善补充解决个人网上银行不能登录的问题2:安装SUN公司的JAVA虚拟机 问题的具体表现为 “网页错误 详细信息为:显示对象不支持此属性和方法”
读书笔记:学习代码深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明
Java虚拟机内存区域的管理是Java开发中最重要的内容之一,对于Java开发者来说,了解Java虚拟机内存区域模型是非常必要的。只有了解了Java虚拟机内存区域模型,才能更好地编写高效、可靠的Java程序。 程序计数器是...
java虚拟机的内存结构,关于内存的相关介绍等,想要了解更多JVM的
- **新生代与老年代**:Java内存分为新生代和老年代,新生代用于存放新创建的对象,老年代则存放生命周期较长的对象。通过调整新生代和老年代的比例,可以优化垃圾回收性能。 - **G1垃圾收集器**:G1是一种并行、...
### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...
第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化
垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点代码编译成本地机器码,提升运行效率。 总的来说,Java虚拟机是Java生态系统中的关键组件,它使得Java程序能够在...
Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...
《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...
- **垃圾回收机制**:垃圾回收是Java虚拟机的一项重要功能,用于自动管理内存,避免程序出现内存泄漏等问题。规范详细介绍了垃圾回收的基本原理和算法。 #### 结论 《Java虚拟机规范(Java SE 7版)》是Java开发者...
6. **JVM内存模型**:Java内存模型(JMM,Java Memory Model)定义了线程如何访问和修改共享变量,以及如何保证内存可见性和一致性。 7. **异常处理与线程**:JVM支持多线程,每个线程有自己的虚拟机栈和程序计数器...
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的...