【JVM】上帝视角看JVM内存模型,分而治之论各模块详情
1. 上帝视角
【树看JVM】
【图看JVM】
2. 分而治之
2.1 堆区
构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden)、幸存者区(survivor from 、survivor to)和老年代。
GC:当创建新的对象时,对象首先会被放入Eden和survivor from中,每经历一次GC存活下来的对象,年龄都会加1。在进行了第一次GC后,在Eden中仍然存活的对象,将被放入survivor to ;而survivor from中的存活的对象将由年龄阀值(maxTenuringThreshold)来决定,如果年龄不超过maxTenuringThreshold的话,将被放入survivor to,如果超过的话,就被放入老年代。
在经历GC之后,Eden和survivor from 都被清空,此时,原先的survivor from转变为survivor to的角色,原先的survivor to转变成survivor from的角色,下一次的GC将会依据上一个原理,继续进行。当survivor to满了之后,survivor to 中的对象将会被放入老年代。
除了年龄阀值会触发对象晋升到老年代之外,还有以下第二种情况能够触发:
前提:survivor to中,相同年龄的对象所占的空间超过一半。
触发:对象的年龄超过了上述前提中对象的年龄,就会直接被放入老年代。
因此,幸存者区存放的数据是Eden区GC后拷贝过来的数据,老年代存放的是数据是幸存者区GC后拷贝过来的数据
2.2 栈区
栈区中存储的是一个一个的栈帧(stack frame),每一个栈帧对应一个被调用的方法,它与方法的生命周期一致,随着方法的调用而被创建,随着方法的结束而销毁。栈帧中存放的是局部变量表(基本数据类型、引用),操作数栈、指向当前方法所属的类的运行时常量池的引用等信息。(运行时常量池在方法区中)。
2.3 方法区
方法区由代码缓存、运行时常量池、持久代(JDK1.8后被删除)组成。
· 持久代:在JDK1.6时方法区存放的是类的结构定义、方法、构造函数、以及存放静态变量,在JDK1.7之后,方法区的持久代被删除,取而代之的是元空间(metaSpace),元空间在本地内存中,与持久代类似,是对JVM规范中方法区的实现。
· 代码缓存:代码缓存中存放的是JIT(just in time)编译器编译后的与硬件相关的代码。可以通过ReservedCodeCacheSize 和 InitialCodeCacheSize两个参数设置。
· 运行时常量池:被所有线程共享,存储的是虚拟机加载Class之后的常量池数据(常量池是Class的一部分,存储着类、接口、方法中的常量)
2.4 元空间(metaSpace)
元空间在JDK1.7时开始取代方法区中的持久代(PermGen),那么,为什么要删除持久代,让元空间取而代之?官方解释如下图:
附官方地址:http://openjdk.java.net/jeps/122
从官方的解释可以看出,由于JRokit中没有持久代而不需要配置,而删除持久代是官方为了融合JRockit与HotSpot所努力的一部分,所以在JDK1.7开始逐步开始取代持久代,到JDK1.8之后彻底删除。
并且,类和方法的信息大小难以确定,永久带经常会发生内存溢出(OOM),java.lang.OutOfMemoryError: PermGen
(关于元空间的溢出,在下篇博文与其它内存溢出的异常一起整理,这里就不再赘述元空间的OOM)
【JVM】TroubleShooting之内存溢出异常(OOM)与调优:https://www.cnblogs.com/snova/p/9195686.html
2.5 本地方法栈
与前面谈到的虚拟机栈类似,区别在于虚拟机栈为虚拟机调用的Java方法服务,本地方法栈是为虚拟机调用的本地方法(Native Method)服务。
Mative Method是一个Java调用一个非Java程序的接口,该方法的实现由非Java语言来实现
-------------------------
以下描述截取自《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。
-----------------------------------------
2.6 程序计数器(PC)
程序计数器记录的是线程下一步要执行的指令字节码地址。在多线程中,各线程之间是抢CPU的关系,要根据抢得时间片的CPU时间资源进行线程切换,因此,每个线程都有一个独立的程序计数器,记录各个线程下一步要执行的指令,这样才能够正常切换。
参考及推荐:
http://openjdk.java.net/jeps/122
https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf
https://www.cnblogs.com/dennyzhangdd/p/6770188.html
http://ifeve.com/jvm-permgen-where-art-thou/
https://blog.csdn.net/zjf280441589/article/details/53437703
【JVM】上帝视角看JVM内存模型,分而治之论各模块详情的更多相关文章
- java架构之路-(JVM优化与原理)JVM的运行时内存模型
还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程.还有我们的双亲委派机制. 我们这次来说一下运行时内存模型.上一段小代码. public class Mai ...
- 轻松学JVM(二)——内存模型、可见性、指令重排序
上一篇我们介绍了JVM的基本运行流程以及内存结构,对JVM有了初步的认识,这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存 ...
- 深入理解JVM(二)——内存模型、可见性、指令重排序
上一篇我们介绍了JVM的基本运行流程以及内存结构,对JVM有了初步的认识,这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存 ...
- 【深入理解JVM】:Java内存模型JMM
多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...
- 【JVM】01虚拟机内存模型
学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博 ...
- 面试突击(八)——JVM的结构及内存模型,是怎么划分的?
声明:本文图片均来自网络,我只是进行了选择,利用一图胜千言的力量来帮助自己快速的回忆相关的知识点 0:再上一张Java代码的转换流程图 .java——Java程序员编写,给人看的 .class——Ja ...
- 【Java杂货铺】JVM#Java高墙之内存模型
Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 <深入理解Java虚 ...
- JVM的艺术—JAVA内存模型
*喜欢文章,动动手指点个赞 * 引言 亲爱读者你们好,关于jvm篇章的连载,前面三章讲了类加载器,本篇文章将进入jvm领域的另一个知识点,java内存模型.彻底的了解java内存模型,是有必要的.只要 ...
- jvm系列五-java内存模型(2)
原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...
随机推荐
- SQL Server ->>监控和管理Tempdb
Tempdb作为一个公共数据库,存储着一些临时的数据.有些是用户自己创建的,有些是SQL Server自己创建的.Tempdb空间被使用的一些常见场景有 用户自定义:临时表和表变量.游标. SQL S ...
- Data Flow ->> OLE DB Destination ->> Fast Load
OLE DB Destination组件提供了fast load选项,用bulk模式load数据而不是row-to-row的模式.这样性能上好.但是需要注意一点就是,一旦用了fast load,err ...
- LeetCode总结 -- 一维动态规划篇
这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaxi ...
- Oracle使用超大SQL脚本文件恢复数据问题记录
在以前获取的Oracle数据库备份一般都是dmp文件,创建表空间和用户就直接使用imp或者impdp导入即可. 这一次遇到的情况比较特殊,对方提供数据时给我的是使用SQLPlus导出的SQL脚本文件, ...
- [问题记录]libpomelo工程调整编译链接错误
1. 描述: 如下图所示,出现链接错误.那么链接问题一般也就两块设置: (1)包含路径Additional Library Directories (2)lib库的包含Additional Depen ...
- 第三周 day3 python学习笔记
1.字符串str类型,不支持修改. 2.关于集合的学习: (1)将列表转成集合set:集合(set)是无序的,集合中不会出现重复元素--互不相同 (2)集合的操作:交集,并集.差集.对称差集.父集.子 ...
- (五)多点触控之兼容ViewPager
在上一篇文章中,自定义的ZoomImageView已经实现了自由缩放,自由移动以及双击放大与缩小的功能.已经可以投入使用这个控件了.下面我们就在ViewPager中使用这个控件.如果你还没读过上一篇文 ...
- BZOJ3245:最快路线(最短路)
Description 精明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知道能开多快.不过有一个合理的方 ...
- 2018.09.23模拟总结(T2)
T1,T3我就不说啦,反正也不会.主要想讲的是T2. T2用了一个神奇的算法:折半搜索. 因为这个坑爹的数据范围告诉我们暴搜或是状压会TLE,而一半刚好能卡过去. 折半搜索其实跟暴搜没什么区别,就是折 ...
- 2.spring:集合属性
1.list 配置java.util.List类型的属性,需要指定<list>标签,在标签里面包含有一些元素,这些标签 可以通过<value>指定简单的常量值,通过<r ...