`

浅谈Java堆内存

阅读更多

一.Java中的堆空间是什么?
        当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,向上排列。当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。

 

二.如何增加Java堆空间?
        在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为 -Xms=3670K 和 -Xmx=64M。

        对于64位操作系统,一般堆空间大小增加约30%.但你使用Java 1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK 1.5之后都支持)来查看,在VM Summary页面可以看到最大的堆大小。

        用这种方法你可以根据你的程序的需要来改变堆内存大小,建议采用这种方法而不是默认值。如果你的程序很大,有很多对象需要被创建的话,你可以用-Xms and -Xmx这两个参数来改变堆内存的大小。Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。另外有一个参数 -Xmn,它表示new generation的大小。须注意的是:你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

 

三.堆和垃圾回收
        我们知道对象创建在堆内存中,垃圾回收这样一个进程,它将已死对象清除出堆空间,并将这些内存再还给堆。为了给垃圾回收器使用,堆主要分成三个区域,分别叫作New Generation,Old Generation或叫Tenured Generation,以及Perm space.New Generation是用来存放新建的对象的空间,在对象新建的时候被使用。如果长时间还使用的话,它们会被垃圾回收器移动到Old Generation(或叫Tenured Generation)。Perm space是JVM存放Meta数据的地方,例如类,方法,字符串池和类级别的详细信息。

 

四.Java堆中的OutOfMemoryError错误
        当JVM启动时,使用了-Xms 参数设置的堆内存。当程序继续进行,创建更多对象,JVM开始扩大堆内存以容纳更多对象。JVM也会使用垃圾回收器来回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,JVM就会抛出java.lang.outofmemoryerror,你的程序就会当掉。在抛出 OutOfMemoryError之前,JVM会尝试着用垃圾回收器来释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误。

        为了解决这个问题,你需要清楚你的程序对象的信息,例如,你创建了哪些对象,哪些对象占用了多少空间等等。你可以使用profiler或者堆分析器来处理OutOfMemoryError错误。

        “java.lang.OutOfMemoryError: Java heap space”表示堆没有足够的空间了,不能继续扩大了。

        “java.lang.OutOfMemoryError: PermGen space”表示permanent generation已经装满了,你的程序不能再装在类或者再分配一个字符串了。

 

五.Java Heap dump
        Heap dump是在某一时间对Java堆内存的快照。它对于分析堆内存或处理内存泄露和Java.lang.outofmemoryerror错误是非常有用的。在JDK中有一些工具可以帮你获取heap dump,也有一些堆分析工具来帮你分析heap dump。你可以用“jmap”来获取heap dump,它帮你创建heap dump文件,然后,你可以用“jhat”(堆分析工具)来分析这些heap dump。


六.Java堆内存(heap memory)十要点
  1.Java堆内存是操作系统分配给JVM的内存的一部分。
  2.当我们创建对象时,它们存储在Java堆内存中。
  3.为了便于垃圾回收,Java堆空间分成三个区域,分别叫作New Generation, Old Generation或叫作Tenured Generation,还有Perm Space。
  4.你可以通过用JVM的命令行选项 -Xms, -Xmx, -Xmn来调整Java堆空间的大小。不要忘了在大小后面加上“M”或者“G”来表示单位。举个例子,你可以用 -Xmx256m来设置堆内存最大的大小为256MB。
  5.你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()来查看Java中堆内存的大小。
  6.你可以使用命令“jmap”来获得heap dump,用“jhat”来分析heap dump。
  7.Java堆空间不同于栈空间,栈空间是用来储存调用栈和局部变量的。
  8.Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来,再释放到Java堆空间中。
  9.当你遇到java.lang.outOfMemoryError时,不要紧张,有时候仅仅增加堆空间就可以了,但如果经常出现的话,就要看看Java程序中是不是存在内存泄露了。
  10.请使用Profiler和Heap dump分析工具来查看Java堆空间,可以查看给每个对象分配了多少内存。

  • 大小: 178.1 KB
分享到:
评论

相关推荐

    浅谈Java堆外内存之突破JVM枷锁

    浅谈Java堆外内存之突破JVM枷锁 本文主要介绍了Java堆外内存的概念,包括JVM内存分配、JVM垃圾回收、堆外内存的垃圾回收等相关内容。Java开发者都知道,Java中不需要手动申请和释放内存,JVM会自动进行垃圾回收;而...

    浅谈JAVA虚拟机JVM及工作原理

    "浅谈JAVA虚拟机JVM及工作原理" Java虚拟机(JVM)是Java语言的 runtime 环境,它提供了一个平台独立的环境,使得Java程序可以跨平台运行。JVM 的主要组件包括虚拟机栈、堆、方法区、程序计数器、本地方法栈等。 1...

    浅谈Java内存区域划分和内存分配策略

    "浅谈Java内存区域划分和内存分配策略" 本文将详细讲述Java内存区域划分和内存分配策略,涵盖程序计数器、虚拟机栈、本地方法栈、堆、方法区等内存区域的概念和作用,以及对象创建过程和内存分配策略。 程序计数器...

    浅谈java+内存分配及变量存储位置的区别

    在Java中,栈内存和堆内存的交互体现在对象引用上。栈中存放的是对象的引用(相当于C/C++中的指针),而对象实例实际存储在堆中。因此,如果两个变量引用同一个对象,修改对象的状态会影响到所有引用它的变量。 ...

    java培训教程-浅谈java虚拟机.pdf

    4. **无用单元收集堆(Garbage-collected heap)**:Java对象在堆内存中分配,JVM负责自动管理内存,包括对象的创建和销毁,通过无用单元收集(Garbage Collection)机制来回收不再使用的内存,避免内存泄露。...

    浅谈Java内存区域与对象创建过程

    浅谈Java内存区域与对象创建过程 Java内存区域是Java虚拟机在执行Java程序的过程中所管理的内存,它被划分为若干个不同的数据区域,每个区域都有其自己的用途和创建和销毁的时间。根据《Java虚拟机规范(JavaSE7版...

    浅谈Java中的变量.pdf

    JVM在运行时将内存划分为不同的区域,如程序计数器、Java堆、栈、方法区和本地方法栈等。其中,局部变量存储在栈中,每个方法调用都会创建一个新的栈帧,用于存储方法的局部变量。成员变量(实例变量和类变量)存储...

    浅谈java内存管理与内存溢出异常

    Java内存管理是Java虚拟机(JVM)的关键组成部分,它主要负责对象的创建、分配、初始化以及回收。本文将深入探讨Java内存管理的原理以及内存溢出异常的原因和解决策略。 首先,Java与C/C++在内存管理上的一个重要...

    浅谈JAVA内存分配与参数传递

    JAVA内存分配与参数传递详解 JAVA内存分配是JAVA编程语言中的一项重要机制,决定了程序在内存中的存储方式和数据交换方式。JAVA参数传递是JAVA编程语言中的一种函数调用机制,决定了函数参数的传递方式。下面对JAVA...

    浅谈C/C++内存泄露及其检测工具

    当通过`malloc`、`calloc`、`realloc`、`new`等函数分配的堆内存没有被相应的`free`或`delete`释放时,就产生了内存泄漏。例如,一个简单的内存泄漏情况可能出现在函数中,如果函数在异常情况下提前退出,忘记释放...

    浅谈Java编程中的内存泄露情况

    例如,堆内存溢出(OutOfMemoryError: Java heap space)通常是由于对象实例或数组创建过多,导致年轻代和年老代空间不足。方法区内存溢出(OutOfMemoryError: PermGen space)则可能由于加载大量类或使用反射等技术...

    浅谈IBM AIX环境下的Java性能调优

    在需要超过2GB堆内存的情况下,64位Java是必需的。IBM的官方网站提供了AIX上的Java软件和补丁下载。 3. Java性能准则 - **字符串操作**:优先使用字符串缓冲区,而非频繁的字符串连接。 - **减少I/O操作**:避免...

    浅谈Java的虚拟机结构以及虚拟机内存的优化

    堆内存是所有线程共享的区域,用于存储Java程序创建的所有对象和数组。由于多线程共享,因此需要考虑同步问题。垃圾收集器会在堆中进行对象的生命周期管理,回收无用的对象。 程序计数器是每个线程独有的一块内存,...

    浅谈为什么java命令运行class文件出现异常共7页.p

    可以调整JVM启动参数,如`-Xms`和`-Xmx`来控制堆内存大小。 3. **环境变量**:`JAVA_HOME`、`PATH`和`CLASSPATH`等环境变量设置不正确也可能导致问题。确保这些环境变量指向正确的Java安装目录和JDK的bin目录。 4....

    浅谈java中的局部变量和全局变量

    浅谈java中的局部变量和全局变量 Java 中的变量可以分为两大类:局部变量和全局变量。理解这两种变量的概念、生存时间和创建位置是java开发者必须具备的基本知识。下面我们将对java中的局部变量和全局变量进行详细...

    浅谈Java程序运行机制及错误分析

    浅谈Java程序运行机制及错误分析 Java程序运行机制是指Java虚拟机(JVM)的运行机制和Java程序的执行过程。Java虚拟机是可运行Java代码的假想计算机,以实现Java语言的跨平台特性。Java程序的运行需要经过编写、...

    浅谈jvm原理

    "浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...

    浅谈Java垃圾回收的实现过程

    1. Eden区:当一个实例被创建了,首先会被存储在堆内存年轻代的Eden区中。 2. Survivor区(S0和S1):作为年轻代GC(MinorGC)周期的一部分,存活的对象(仍然被引用的)从Eden区被移动到Survivor区的S0中。 3. 老...

Global site tag (gtag.js) - Google Analytics