JVM
2019-09-03 11:12:37 18 举报
AI智能生成
JVM数据模型吐血整理
作者其他创作
大纲/内容
JVM
Java 虚拟机栈
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;
本地方法栈
PC寄存器
堆
堆解决的是数据存储的问题,即 数据怎么放、放在哪儿。
堆内存
年轻代(Young Generation
Eden
Survivor
FromSpace
ToSpace
老年代(Old Generation)
非堆内存
元空间(MetaSpace)
元空间并不在JVM中,而是使用本地内存
JVM堆内存常用参数
-Xms\t堆内存初始大小,单位m、g
-Xmx(MaxHeapSize)\t堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize\t非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize\t非堆内存最大允许大小
-XX:NewSize(-Xns)\t年轻代内存初始大小
-XX:MaxNewSize(-Xmn)\t年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8\t年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss\t堆栈内存大小
元空间
元空间并不在虚拟机中,而是使用本地内存
好处
类及相关的元数据的生命周期与类加载器的一致。
每个加载器有专门的存储空间
只进行线性分配
不会单独回收某个类
省掉了GC扫描及压缩的时间
元空间里的对象的位置是固定的
如果GC发现某个类加载器不再存活了,会把相关的空间整个回收掉
元空间的内存分配模型
绝大多数的类元数据的空间都从本地内存中分配
用来描述类元数据的类也被删除了
分元数据分配了多个虚拟内存空间
给每个类加载器分配一个内存块的列表。块的大小取决于类加载器的类型; sun/反射/代理对应的类加载器的块会小一些
归还内存块,释放内存块列表
一旦元空间的数据被清空了,虚拟内存的空间会被回收掉
减少碎片的策略
存储的数据
JVM中类的元数据在Java堆中的存储区域。
Java类对应的HotSpot虚拟机中的内部表示也存储在这里。
类的层级信息,字段,名字。
方法的编译信息及字节码。
变量
常量池和符号解析
GC
回收方式
Minor GC : 清理年轻代
Major GC : 清理老年代
Full GC : 清理整个堆空间,包括年轻代和永久代
垃圾回收算法
标记-清除(Mark-Sweep)
复制(Copy)
标记-整理(Mark-Compact)
垃圾收集器
串行收集器(Serial)
比较老的收集器,单线程。收集时,必须暂停应用的工作线程,直到收集结束。
并行收集器(Parallel)
多条垃圾收集线程并行工作,在多核CPU下效率更高,应用线程仍然处于等待状态。
CMS收集器(Concurrent Mark Sweep)
CMS收集器是缩短暂停应用时间为目标而设计的,是基于标记-清除算法实现
初始标记(Initial Mark)
并发标记(Concurrent Mark)
重新标记(Remark)
并发清除(Concurrent Sweep)
G1收集器(Garbage First)
最终标记(Final Mark)
筛选回收(Live Data Counting and Evacuation)
垃圾收集器参数
-XX:+UseSerialGC\t串行收集器
-XX:+UseParallelGC\t并行收集器
-XX:+UseParallelGCThreads=8\t并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等
-XX:+UseParallelOldGC\t指定老年代为并行收集
-XX:+UseConcMarkSweepGC\tCMS收集器(并发收集器)
-XX:+UseCMSCompactAtFullCollection\t开启内存空间压缩和整理,防止过多内存碎片
-XX:CMSFullGCsBeforeCompaction=0\t表示多少次Full GC后开始压缩和整理,0表示每次Full GC后立即执行压缩和整理
-XX:CMSInitiatingOccupancyFraction=80%\t表示老年代内存空间使用80%时开始执行CMS收集,防止过多的Full GC
-XX:+UseG1GC\tG1收集器
-XX:MaxTenuringThreshold=0\t在年轻代经过几次GC后还存活,就进入老年代,0表示直接进入老年代
对象
对象的创建
第一步:类加载检查
第二步:分配内存
第三步:初始化内存空间
指针碰撞
空闲列表
第四步:对对象进行必要设置
第五步:执行<init>方法
对象的内存布局:
1、对象头
(1)Mark Word
对象自身的运行时数据
哈希码(HashCode)
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
分支主题
(2)类型指针
对象指向其类元数据的指针,虚拟机通过这个指针确定该对象是哪个类的实例
2、实例数据
3、对齐填充
0 条评论
下一页