Thinking in java-2 Java内存模型

1.JVM Memory Model

Thinking in java-2 Java内存模型
从上图可以看出,JVM内存被分为几个部分。在大的层面上,JVM Heap 内存被物理上分为了2个部分--年轻代和老年代。

2. 内存管理之--年轻带Young Generation

Young generation 是所有新对象创建的地方。当年轻带被填满后,垃圾回收GC开始工作。这种垃圾回收叫做Minor GC. Young Generation 分为三个部分,分别为Eden Memory(伊甸区), Survivor Memory0(存活区0), Survivor Memory1。
关于年轻带具有以下特点:
  • 绝大部分新创建的对象位于伊甸区;
  • 当伊甸区被对象填满时,Minor GC开始工作;所有的幸存对象(指Eden Memory)被移到2个存活区之一。
  • Minor GC也会检查幸存区对象,并把幸存对象移到另外的一个幸存区。所以,同一时刻总有一个幸存区是空的。
  • 在很多轮GC过后幸存的对象被移动到老年代的内存空间。通常是通过设置一个阈值的方式,当年轻带对象达到一定代数后将被升级到Old generation。

3. 内存管理之--老年代 Old Generation

老年代内存包含了长期存在和在很多轮 Minor GC后存活下来的对象。当老年代内存区满了之后,垃圾回收才开始工作。在老年代进行的垃圾回收操作叫做Major GC,通常耗费更长时间。
垃圾回收机制:Stop the world event
在垃圾回收进行过程中,所有的应用线程被终止直到回收完成。
垃圾回收的时间取决于用于垃圾回收的策略。所以,有必要监视和调整垃圾回收器,来防止需要高度响应的应用出现超时的情况。
4. 内存模型之--永久代 Permanent Generation
    Permanet Generation不是Java Heap Memory。这里有JVM所需要的用于应用中的描述类和方法的元数据。
Per Gen被运行时JVM基于应用所使用的类占据。永久代部分也有Java SE library和方法。永久代对象在一次full garbage collection中被垃圾回收。

5. 内存模型之--方法区

方法区是永久带中的一部分空间,用于存放类结构(包括运行时constants和静态变量),以及方法和类方法和构造函数的代码。

6. 内存模型之--内存池 Memory Pool

内存池是又JVM 内存管理器创建的一池用于创建不可改变对象,如果实现支持的话(翻译硬伤,here)。
 内存池可以属于堆也可能属于永久带,这取决于JVM内存管理器的实施。String Pool是该类内存池的一个实例。

7. 内存模型之--运行时常量池Runtime Constant Pool

运行时常量池是每个类的运行时常量的表示。它包含了类的运行时常量和静态方法,是方法取得一部分。

8. 内存模型之--Java Stack Memory

Java Stack memory用于线程执行。包含特定的方法值(这些值一般都只能短期存活),以及该方法中使用的堆中其他对象的引用

9. 内存管理--Java 堆内存切换

Java提供了很多工具用于内存设置,我们可以通过参数设定内存大小和它们所占的比率。
这里有关于JVM Memory设置的说明。
VM SWITCH VM SWITCH DESCRIPTION
-Xms For setting the initial heap size when JVM starts
-Xmx For setting the maximum heap size.
-Xmn For setting the size of the Young Generation, rest of the space goes for Old Generation.
-XX:PermGen For setting the initial size of the Permanent Generation memory
-XX:MaxPermGen For setting the maximum size of Perm Gen
-XX:SurvivorRatio For providing ratio of Eden space and Survivor Space, for example if Young Generation size is 10m and VM switch is -XX:SurvivorRatio=2 then 5m will be reserved for Eden Space and 2.5m each for both the Survivor spaces. The default value is 8.
-XX:NewRatio For providing ratio of old/new generation sizes. The default value is 2.
Thinking in java-2 Java内存模型