jvm虚拟机学习(二)


前言

`承接上文,继续总结
jvm
其中
1、程序计数器
java方法: 虚拟机字节码指令的地址
native: undifined
2、本地方法栈
native
3、stack
每个方法对应一个虚拟机栈,私有的
局部变量,操作数栈
4、方法区(永久代)
共享、对不同jdk版本有如下差异
1.6 有永久代,常量池放到方法区
1.7 有永久代,常量池放到堆中
1.8 元空间 64位jvm默认21M
5、堆
创建出来的大部分对象都放在堆中,是GC的主要区域

一、如何创建对象

在java里,我们一般通过如下方式进行对象创建
new方式、反射、clone方式、序列化方式

二、创建的对象放到哪

首先需要了解一个概念逃逸分析

  1. 方法逃逸
    当一个对象在方法中定义之后,作为参数传递到其它方法中;
//方法逃逸
public static StringBuffer createStringBuffer(String s1, String s2) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    return sb;
}
  1. 线程逃逸
    如类变量或实例变量,可能被其它线程访问到

那么针对这些逃逸,jvm如何优化了
优化分析

  • 如果没有方法逃逸,直接在栈上进行内存分配
  • 如果没有线程逃逸,可以采取同步策略擦除
  • 可以使用标量替换(标量、聚合量)

逃逸分析相关参数
-XX:+DoEscapeAnalysis : 开启逃逸分析
-XX:-PrintEscapeAnalysis: 查看逃逸分析结果
-XX:+EliminateAllocations 开启标量替换
-XX:+EliminateLocks 开启同步擦除

三如何分配空间

这里只考虑在堆上分配的情况

  1. 指针碰撞
  2. 空闲列表
    上面两个具体如何选择由堆空间是否规整->最后由具体垃圾回收器决定
  3. 多线程场景下如何保证安全(TLAB)
    -XX UserTLAB 默认占eden空间的1%
    -XX: TLABWesteTargetPercent 修改所占Eden空间百分比
    如果需要分配的内存大小已经大于TLAB规定的大小,会采用CAS方式竞争新的堆内存空间

四对象的结构

对象结构=对象头+实例数据+对齐填充
对象头=markword+kclass+数组长度
实例数据:相同宽度的数据放到一起
对齐填充:8字节整数值填充

栈堆对象指向关系
1、直接指向
一次指向,但是对象发生变化时需要重新指
2、句柄指针
两次指向,但是对象发生变化时,不需要重新指向

OOM产生场景
1、方法栈上栈溢出
2、方法堆上堆溢出
3、直接内存溢出
4、元空间溢出

如何确定GC回收对象

1、 引用计数法(无法解决循环引用问题)
2、可达性分析(GC ROOTS)
作为GC roots的变量
2.1 栈帧本地变量表
2.2方法区常量池(1.7及以前,1.8放到堆中了)
2.3 方法区静态属性
2.4 活跃线程引用对象
2.5 本地方法栈JNI对象(一般为native方法)

垃圾回收算法

1、标记清除(有内存碎片)
2、复制算法(内存利用率低)
3、标记整理(算法复杂度高)
4、分代算法
年轻代(1/3)
eden(8/10) 、from(1/10)、 to(1/10)
老年代(2/3)
4.1 新创建的对象尝试放到eden区,如果超过eden总量,则直接放到老年代
4.2 如果eden没有足够的空间,则触发一次minorGC,将from与eden中存活的对象放到to区,对象年龄+1
,回收form和eden区,from区和to区互换
4.3 如果to区也没有足够的空间,则将满足条件的对象移入老年代(6,15)
4.4 如果老年代空间也不足了,则触发full GC(stop the world和安全点)

垃圾回收器分类

新生代: Serial、Parnew、paraller scavenge(j并行)

老年代 cms、Serial old、paraller old(并行)

跨代: G1(分代:三色标记+写屏障) ,ZGC、shenandoah

现在1.8常用组合:
paraller scavenge与paraller old,Serial与Serial old

CMS回收器

  • 初始标记(stw,标记GC ROOTS直接关联的对象)
  • 并发标记(并发追溯标记,程序不会停顿)
  • 重新标记(暂停虚拟机,扫描CMS堆中剩余对象)(三色标记)
  • 并发清理(清理垃圾对象,程序不会暂停)
  • 并发重置(重置cms回收器数据结构)

G1(三色+写屏障) jdk9默认
分为大小相等的独立区域,老年代和年轻代是逻辑分区
rset(哈希表,记录引用),cset(清理的集合)
mixGc(和cms相似)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值