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 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: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
Jvm 内存模型 —— GC的更多相关文章
- JVM内存模型与GC算法
1.JVM内存模型 JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明 ...
- jvm-垃圾回收gc简介+jvm内存模型简介
gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...
- JVM内存模型与GC算法(简介)
JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 ...
- 关于JVM内存模型,GC策略以及类加载器的思考
JVM内存模型 Sun在2006年将Oracle JDK开源最终形成了Open JDK项目,两者在绝大部分的代码上都保持一致.JVM的内存模型是围绕着原子性(操作有且仅有一个结果).可见性(racin ...
- JVM内存模型及GC回收算法
该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录. 内存模型 GC垃圾回收 1.内存模型 从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域.其中最为 ...
- JVM内存模型以及HotSpot的GC策略
概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳 ...
- JVM内存模型及GC机制
一.JVM简介 1.1什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各 ...
- JVM内存模型和性能优化 转
JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...
- JVM内存模型和性能优化
JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...
随机推荐
- spring cloud--zuul网关和zuul请求过滤
这里仍然以Windows和jdk为运行环境,按照下面的步骤打包-运行-访问就能看到效果.启动项目jar包: java -jar F:\jars-zuul\register-0.0.1-SNAPSHOT ...
- pointer-events属性屏蔽鼠标事件(点击穿透上层元素)
应用场景 我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的 ...
- 项目debug启动不起来解决办法
debug起服务,读取文件可能会出错,eclipse自动加断点,这时候就卡住了,这时候eclipse——window——show view breakpoints-——remove all,重新启动t ...
- PHP取一算法
一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大 ...
- mysql启动失败问题记录
net start mysql 启动mysql服务,启动失败: 手动启动服务,又失败 命令查看日志:mysqld --console 在网上找了解决办法如下: 找到mysql目录,进去bin目录,找到 ...
- Jmeter组成结构及运行原理
Jmeter结构主要组成要素包括:测试计划,线程组,采样器以及监听器.对于各部件的作用域关系如下图: Jmeter是纯Java程序,使用JVM,运行采用多线程完成,往往单台负载机由于机器配置有限,支持 ...
- Windows激活最高权限
两种方法激活最高权限 方法1 用鼠标右键点击要操作的文件或文件夹,依次进入"属性→安全→高级→所有者→编辑",在"将所有者更改为"栏中选择登录系统的管理员用户, ...
- Excel—数组
SUMPRODUCT(数组求和函数)和SUM是一样的,只不过数组写完公式后需要三键合一出结果(ctrl+shift+enter),用SUMPRODUCT写公式写完直接敲击enter就行了 函数语法:S ...
- pwn易忘操作原理笔记
堆溢出漏洞: 一.null-byte-off-by-one 漏洞原理:由于输入操作失误,导致可以把size最低字节修改为\x00,overlapchunk利用. 构造 1.freeB,此时C的pres ...
- 自动化设计模式Page Object
https://blog.csdn.net/qq_37546891/article/details/79052054#t1