Jvm 内存模型 —— GC

一、Jvm 原理

 

 

二、Jvm 运行时数据区( Run-Time Data Areas )

 

(主要是关于 non-stack 区域的详细划分)

 

从上图可以清楚地看到:程序计数器、Jvm 栈、本地方法栈 —— 线程级别的(随线程的创建和退出而存在销毁),堆内存、方法区—— Jvm 级别 (堆内存和方法区被所有线程共享)。

Program Counter Register用于控制每个线程的执行。

 

 三、Jvm 栈空间(方法相关)

 

栈表示的是 Java方法的内存模型。方法从开始执行到结束,都对应了一个栈帧在虚拟机栈中入栈到出栈的过程。每个方法在执行的时候都会创建一个 “栈帧” 用来存储局部变量表、操作数栈、动态链接、方法出口等,每一个方法从开始执行到结束,都对应了一个栈帧在虚拟机栈中入栈到出栈的过程。操作数栈存放运行中的各种指令。

 

四、堆内存

用以存储数组(貌似数组也是对象)和实例,在 jvm启动时就创建了,gc 就在这个区域里工作。

 

五、Gc 中的堆与非堆内存划分

 

Ⅰ 堆内存:

 

heap:

  |__ eden space (1 of Young Generation

  |__ survivor (2 of Young Generation

  |__ tenured/old

 

1> 新生代

用于存放新创建的对象,当新生代填满时,GC 开始执行。这个GC 被称为 Minor GC。新生代(Young Generation)被划分为 3 个部分:1 Eden + 2 Survivor

  • 大多数新创建的对象位于 Eden memory space.
  • 当 Eden space  填满对象时, Minor GC 开始执行 并且 survivor对象移动到 其中之一的 survivor spaces。
  • Minor GC 也会检查 survivor 对象 并且移动他们到另一个 survivor space. 因此, 有一时其中一个 survivor space总是空的。
  • 经过多次 GC幸存下的对象,被移动到老年代区域 Tenured/Old Generation Space)。

 

2> 老年代

通过多次 Minor GC 循环,活跃/幸存时间较长的对象被存放在老年代。当老年代内存填满时,执行 Major GC,通常需要花费更长时间。

 

Ⅱ非堆内存

 

non-heap:

  |__ code cache

  |__ Native Method Stack

  |__ memory used by the JIT compiler (compiled native code)

  |__ Jvm Stack

  |__ perm gen / Metaspace in HotSpot 8

 

 

 

永久代(perm gen)不属于堆内存。它包含应用的 classes 与 methods 的元数据(其中包括反射的类、 JavaSe 的类与方法等)。虽然不属于堆,但是有逻辑联系,取决于相关实现,永久代在 full garbage collection 进行垃圾回收。Jdk1.8 使用元空间代替永久代,并将原来存放在永久代中的字符串常量移动到堆内存中(Jdk1.7 亦实现)。

 

六、方法区(类相关的)

用以存储每个类的主要构成,包含常量池、域、方法数据,以及方法及构造器的代码。

元空间是方法区在 HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。(关于元空间的更多介绍

 

七、方法区中的常量池

作用:用于存放各种字面量和符号引用。字面量:如文本字符串,final 字段等,符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符。JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。加载阶段,虚拟机 将class常量池中的内容存放到运行时常量池中;解析阶段,将符号引用替换为直接引用。

分类:字符串常量池,class 常量池,运行时常量池。

 

垃圾收集器分类

序号 收集器 收集范围 算法 执行类型
1 Serial 新生代 复制  单线程
2 ParNew 新生代 复制  多线程并行
3 Parallel 新生代 复制  多线程并行
4 Serial Old 老年代 标记整理 单线程
5 CMS 老年代 标记清除 多线程并发
6 Parallel Old 老年代 标记整理 多线程
7 G1 全部 复制算法,标记整理 多线程

 

STW总会发生 不管是新生代还是老年代 就算是CMS也有STW的时候,重点是 时间长短。新生代的串行、PartNew,Part scavenge 收集器都需要stw。这些收集器中,串行肯定是停止用户线程的,并行和并发是有区别的,这里并行是指多个GC线程同时进行,用户线程还是需要被挂起。CMS里面有一个并发标记阶段是不需要stw的,和用户线程一起执行,但是初始标记和重新标记需要stw。

 

内存管理选项

参考

查看参数默认值命令 java -XX:+PrintFlagsFinal -version | grep HeapSize,一般初始堆内存为物理内存 1/64,最大堆内存为物理内存的 1/4。比如物理内存为 8g,则理论上其值分别为 128m, 2048m 内存。

用法示例:java -Xms1024m -Xmx2048m Program

 

VM SWITCHVM 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:StringTableSize For setting  the string pool map size
-XX:+PrintStringTableStatistic Print you the string pool usage when your program terminates
-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.
 -XX:+PrintGCDetails  Print more details at garbage collection. 

 

 

参考资料


https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5

https://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html

https://www.yourkit.com/docs/kb/sizes.jsp

https://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java

https://dzone.com/articles/understanding-the-java-memory-model-and-the-garbag

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not

https://www.cnblogs.com/paddix/p/5309550.html

 

posted on 2018-07-01 20:08  Lemo_wd  阅读(420)  评论(0编辑  收藏  举报

导航