JVM第二篇之字节码加载、组成部分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zanpengfei/article/details/86307994

1、Class字节码的加载

1)ClassLoaderde的继承关系从BootStrapClassLoader开始,然后是ExtClassLoader,最后是AppClassLoader

2)BootStrapClassLoader用户加载java自带核心类(例如java.lang.*)

3)ExtClassLoader加载jre/lib/ext/目录下的jar包

4)AppClassLoader加载classpath下面的类

5)Class类加载过程:1、读取文件2、链接,对加载的字节码进行解析、校验3、初始化

6)static   stitic变量。Final static变量 普通块  对象的构造方法  执行顺序  待确认

7)jdk提供的动态代理即实现InvocationHandler接口,实现他的invoke方法,这种技术实现的AOP有几个缺点:1、必须基于接口来实现,只能调用接口对应的方法2、只在外部调用这些方法时,才会调用嗲里嗲气的invoke方法,进入方法后可以随便调用内部的方法

8)字节码增强俩种实现机制:1、创建原始类的一个子类,目前的SpringAOP也是通过这种方式实现2、只饿极修改原来Class字节码

9)实现字节码增强的步骤:1、在内存中获取到原始的字节码,然后通过“开源届”的API修改它的byte数组,2、将这个新的byte数组写到PermGen区域,加载它或者替换原来的Class字节码

10)修改字节码的俩种方式:1、类加载时修改字节码。 2、运行时修改字节码信息

2、Hotspot JVM组成部分

1)Heap时堆堆堆堆,主要包括Young和Old

2)Young空间被分为2部分(3个板块),即1个Eden区+2个Surviour区(S0+S2)

3)当不断的创建对象,首先对象先放到Eden区,当Eden区满了时候,开始做Young GC,第一次GC从Eden区找出活的对象,将其放到S0区,最后清空Eden区,如果S0满了,只能将剩下的对象放到Old区域;以后创建的对象还是首先放到Eden区域,当第二次Eden区域满了后,开始做GC时候,将Eden + So区域活的对象迁移到S1中,若S1满了,将剩下的对象放到Old区域;当第三次/第4次发生GC时,重复上述的过程。FULL GC会扫描清除Old区域的死对象

4)-XX:SurvivorRatio = 8 参数含义:Eden/Survivor区域比重

5)-XX:InitialSurvivorRatio=8 参数含义:Young/S0比重

6)-XX:PermSize、-XX:MaxPermSize :永久带设置参数

5、常见的GC回收算法

1)-XX:PrintGCDetail:查看Young、Old、Perm空间分别采用什么方法做GC

2)-XX:MaxGCPauseMillis:设置最多的暂停时间

3)-XX:GCTimeRatio:设置GC时间比例

4)并行GC至少有俩种情况会导致Full GC:

a)Old区域满的时候(确切说是要晋升的对象大雨Old区域剩余的空间)

b)Old区域的剩余空间已经小于平均晋升控价的大小的时候

5)CMS垃圾回收器:是一种并发GC,适合管理更大的内存

6)CMS GC的七个基础步骤:

a)CMS-inintial-mark:单线程处理,完全暂停JVM,从root根开始,降所引用的对象标记在一个BitMap中,业务恢复正常运行,GC进行下一步

b)CMS-concurrent-mark:对BitMap中的信息进行并发标记对象,程序不停

c)CMS-concurrent-preclean:将Young与Old之间的引用梳理出来,节约remark时间

d)CMS-concurrent-abortable-preclean

e)CMS-remark:JVM全暂停,根据一个“卡表”清除一些“脏数据”脏数据是由于业务的并发

f)CMS-concurrent-sweep:不停机、单线程按照内存地址顺序遍历Old、Perm区域,更具BitMap记录,对垃圾内存进行清除操作

h)CMS-concurrent-reset:程序运行过程中,许多局部变量脱离了作用域被重新赋值,该步骤就是进行这部分数据的回补,将中间产生变化的内容进行重新标记

7)-XX:+UserConcMarkSweepGC:启用CMS,启用后默认对Young空间启用ParNew算法

8)-XX:+UserCMSInitiatingOccupancyOnly:仅仅使用设置的比例,不做自动调整

9)-XX:CMSInitiatingOccupancyFraction=70:当Old区域的空间上升到70%时启动CMS GC

10)-XX:CMSFullGCsBeforeCompanction(默认值是0):代表多少次不做压缩FULL GC后做一次压缩

11)-XX:ParallelCMDThreads:设置 CMS GC的线程数

12)-XX:+CMSClassUnloadingEnabled:设置回收Perm区域的Class

13)-XX:CMSInitiatingPermOccupancuFraction:设置Perm区域百分比到多少时启动CMS对其回收

14)窜行GC适用在CPU数量少,内存小的应用中

15)JVM暂停所有的线程:

a)抢先式中断:发生GC时,强制暂停所有的线程,若某些线程没到达“安全点“,先让其运行至安全点

b)主动式中断:使每个线程主动到“安全点”停止;具体步骤是当发生完全暂停时,会将JVM的内存页设计为不可读的状态,在安全点插入一个一条汇编语句,当线程运行到该区域时会读该条插入的汇编指令,若该内存是不可读的状态,则线程会主动停下来;若线程处于睡眠或者是等待的状态,他们被唤醒时GC还在运行,则就会出问题,JVM设置了一个“安全区域”的概念,,当出现GC时,这些线程会进入这个区域,若线程要离开时,先检查JVM本身是否在做GC的标记状态,若相应的标记时安全的,该线程才能继续执行

猜你喜欢

转载自blog.csdn.net/zanpengfei/article/details/86307994
今日推荐