`

Java之内存模型之堆内存(Heap)

阅读更多
Java 内存模型之堆内存(Heap)


一、背景知识:内存类型介绍




1、什么是 Perm Gen?

Perm Gen : Permanent Generation

Perm Gen 区是一个特殊的JVM内存区,因为它用来存储用来描述 Class 的
元数据(Class 可以不属于Java语言的一部分,也可以属于),诸如:描述类及其方法。

在大的应用中该区一会儿就满了,并抛出错误:java.lang.OutOfMemoryError: PermGen
然而无论你怎么设置 -Xmx 也不管用。
因为设置其大小的参数不是 -Xmx,而是 -XX:PermGen, -XX:MaxPermGen (不同Java版本略有变化)


2、Heap VS. Stack VS. Perm

Heap(堆内存):
使用Java语言创建的所有的引用对象类型,都在此存储。并由 GC (Garbage Collection)对其进行管理,
诸如:释放不再被程序引用的对象所占据的内存。

Stack(栈内存):
与 Heap 相对的是,Stack 存放基础数据类型。诸如:int, char 等。
由程序的执行顺序控制变量的进出栈顺序,而不是由 GC 控制栈内存的管理。

Perm(持久内存):
用于存储类的元数据。诸如:类的定义,方法的定义等。

Perm 的生命周期与 JVM 绑定,而 Heap 的生命周期与程序绑定。



二、堆内存(Heap) 与 Garbage Collection

理解 GC (Garbage Collection),需要理解 Heap 。

JVM 的 Heap 堆内存在物理上被划分为两部分:Young Gen, Old Gen


1、 JVM 内存管理之:Young Gen

所有新创建的 Object 首先被放在 Young Generation 内存区。
如果 Young Generation 内存区满了,则执行 Garbage Collection 。这种 GC 称为 Minor GC。
Young Generation 区又分为三部分: Eden Memory,Survivor0 Memory (S0),Survivor1 Memory(S1).


Young Generation 内存区要点:

1、绝大多数新建的 Object 被放在 Eden Memory

2、如果 Eden Memory 内存满了,则进行 GC 操作。
   同时把未被 GC 的 Object 移动到 S0 或 S1 中。
   此时 Minor GC 也会检查和移动 S0 和 S1 中的对象。
   最后使 S0,S1 其中一个置为空。

3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。
   通常 Object 会被 GC 设定一个轮询的阀值。


2、 JVM 内存管理之:Old Gen

Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。
与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。
耗用的时间也相对较长。

stop-the-world 事件
Young Gen 和 Old Gen 都可以主动触发 stop-the-world 事件,挂起所有任务,执行 GC 操作。
被挂起的任务只有在 GC 执行完毕后,才会恢复执行。
多数情况下, GC 性能调优(GC tuning)就是指降低 stop-the-world 时 GC 执行的时间。


三、Perm Gen

JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据
(application metadata),用来描述类及其方法的原始信息。
注意:Perm Gen 不是 Heap 的一部分。

Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。
Perm Gen 中同时包括 Java SE 包中的类。
Perm Gen 只有在执行 Full GC 时才会被 GC。


四、内存管理调优参数

-Xms
设置JVM启动时的堆内存(Heap)的大小

-Xmx For setting the maximum heap size.
设置堆内存(Heap)的最大值

-Xmn
设置 Young Gen 内存区的大小

-XX:PermGen
设置 Perm Gen 内存的初始大小

-XX:MaxPermGen
设置 Perm Gen 内存的最大值

-XX:SurvivorRatio
设置 Eden Gen 与 S0 Gen,S1 Gen 内存的大小比。默认值:8
例如:
Young Gen 大小为 10M,
-XX:SurvivorRatio=2
则:
Eden Gen 的大小为 5,
S0 和 S1 的大小分别为 2.5
   
-XX:NewRatio
设置 Old Gen / Young Gen 的值。默认:2


大部分情况下,默认值不用调。详细请参考官方文档


五、Java内存管理之 Garbage Collection


垃圾回收 GC (Garbage Collection) 是 Java 鉴别、移出内存中不再使用的对象,
并释放其所占内存的过程。

Java 语言的一项非常好的特点就是:自动垃圾回收(Automatic GC)。
不像其它语言(例如 C 语言),需要手动释放内存。

Java 的垃圾收集器是一个在后台运行的程序,它检查所有在内存中运行的对象,
并找出那些不再在程序中的任何地方引用到的对象。
这些对象将被声明为程序运行垃圾,以释放其所占的内存,为其它对象继续使用。

GC 的运行步骤:

      1、Marking(标记):
          这是GC工作的第一步。鉴定出不再使用的对象,并对其进行标记。

      2、Normal Deletion(一般化删除):
          移除不使用的对象,并释放其所占空间。

      3、Deletion with Compacting(压缩删除):
          在删除所有不再使用的对象后,所有未被删除的对象将被移动到一起。
          这样可以提高对 new Objects 分配内存时的性能。


这种简单的 Mark 然后 delete 的方式有两点不足:

      1、不高效。新对象刚创建完,还没有被引用时就被删除了。
      2、重复。那些即使一直被程序引用的对象,也要在每次的GC轮询中被检查。








-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2351465

















-
引用:
http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java
http://stackoverflow.com/a/4848711/2893073
http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection




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

相关推荐

    Java 8 内存模型.pdf

    在Java内存模型中,堆被分为两个主要部分:青年代(Young Generation Space)和终身代(Tenured Generation Space),即“新生代”和“老年代”。 青年代是新创建的对象存放的地方,其中包括Eden区和Survivor区。...

    java 内存溢出分析工具 HeapAnalyzer

    - 理解Java内存模型(堆、栈、方法区等)对使用内存分析工具至关重要。 总之,HeapAnalyzer是Java开发者处理内存溢出问题的强大助手。通过熟练掌握其使用,我们可以有效地定位并解决内存问题,提升应用的稳定性和...

    Java内存模型详解

    Java内存模型中另一个重要的组成部分是堆(Heap)和栈(Stack)。 - **堆**:用于存储对象实例。每个对象都位于堆上的某个位置,而对象的引用则存储在线程的本地栈中。堆空间由垃圾回收器管理,以释放不再使用的...

    Java中堆内存与栈内存分配浅析

    本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...

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

    Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    Java内存分为堆(Heap)、方法区(Method Area)、栈(Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)五大部分。HeapAnalyzer主要关注的是堆内存,特别是新生代(Young Generation)、老...

    Java 虚拟机JVM内存模型

    ### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...

    Java内存模型分析与其在编程中的应用.pdf

    Java内存模型是Java平台的核心概念之一,它定义了Java程序中各种变量的访问规则以及如何在运行时分配内存区域给对象。Java内存模型的深入分析对于编写高性能的Java应用程序至关重要,本文将详细探讨Java内存模型的...

    java内存模型详解--非常经典

    Java内存模型将内存划分为几个区域,主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine ...

    ibm-java-堆内存分析工具-heapanalyzer

    - **Java内存模型**:包括堆内存、栈内存、方法区、本地方法栈和程序计数器等部分。 - **垃圾回收(GC)原理**:了解如何自动回收不再使用的对象,以及不同垃圾收集器的工作机制。 - **内存泄漏**:理解内存泄漏...

    Java 内存模型

    Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...

    java jvm内存模型

    Java虚拟机(JVM)内存模型是Java虚拟机的核心组件之一,它定义了Java程序在运行时的内存布局和管理方式。JVM内存模型主要分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。 1. 程序计数器(Program ...

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...

    Java虚拟机内存区域模型

    Java虚拟机内存区域模型是Java虚拟机管理的内存区域模型,该模型将内存区域分为程序计数器、虚拟机栈、本地方法栈、堆和方法区五个部分。程序计数器是一块较小的内存空间,用于记录当前线程执行的字节码指令地址。...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    为了解决这个问题,我们需要深入理解Java内存模型以及如何调整JVM的内存设置。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,...

    Java内存模型描述及变量运用分析.pdf

    在Java内存模型中,堆内存和栈内存是两个核心概念。堆内存主要存放对象的实例,所有通过new创建的对象都会在堆内存中分配空间。而栈内存是存放基本类型和对象引用的地方。 在Java中,内存管理由Java虚拟机(JVM)...

    java 语言基础 内存模型

    Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域、静态域和数组元素)来完成隐式通信。JMM控制Java线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见。 2. ...

Global site tag (gtag.js) - Google Analytics