JVM

类加载器(new,获取静态方法,父类没有被调用过,反射调用等):

载入:加载.class文件通过全限定名获取二进制字节流,根据字节流生成方法区运行时数据,方法区创建class对象,作为外部访问接口.

链接:

   验证:文本格式,元数据,符号引用,字节码等验证

    准备:为类分配内存,类变量初始化为0

    解析:符号引用变为直接引用

初始化:静态变量,静态代码块等被赋值

执行引擎

获取内存中数据进行编译执行以及垃圾回收等。(解释器,即时编译器,垃圾回收器)

JVM内存模型

方法区:类信息、方法信息,字段信息,类变量、运行时常量池等

堆(–Xms、-Xmx ):eden:s=4:1(–XX:SurvivorRatio)新生代:老年代=1:2(–XX:NewRatio)  ,

堆内存用来存放new创建的对象和数组。有,默认初始化值,可自动垃圾回收

java栈:每一次函数调用,都会有一个栈帧被压入栈中,一个栈包含(局部变量表,操作数栈和帧数据区)

逃逸分析实现临时对象的优化。标量替换(确定对象不会逃逸出方法,对象的创建变成成员变量的创建放入栈中),栈内存中的数据,没有默认初始化值,需要手动设置。

参数:

-Xms 256m

-Xmx 256m

-Xmn 85m

-XX:NewRatio=2

-XX:SurvivorRatio=8

-XX:PermSize=30m

-XX:MaxPermSize=30m

-XX:+PrintGCDetails

-XX:MaxDirectMemorySize

-Xss 128k栈大小

垃圾收集器

parNew:复制算法多线程收集,

CMS:标记清除算法(-XX:+UseConcMarkSweepGC)

初始标记:GC Roots能直接关联到的对象,STW

并发标记:关联到的对象中存活的对象,程序也在运行

再次标记:多线程并行执行并发标记期间产生的活动对象,进行确认,STW

并发清除:回收垃圾对象,程序也在运行

CMS的默认收集线程数量是=(CPU数量+3)/4

缺点:

1.浮动垃圾,预留空间92%(XX:CMSInitiatingOccupancyFraction),并发清除时候产生,预留不足时通过Serail Old进行标记整理算法进行压缩(会产生另一次fgc)

2.内存碎片,大量不连续内存碎片,导致提前fgc,通过设置XX:+UseCMSCompactAtFullCollection,开启内存碎片的合并整理过程(-XX:+CMSFullGCsBeforeCompaction),设置多少次fgc以后进行压缩整理。需要维护空闲列表用于分配内存

G1:

region连续内存块,标记整理算法,-XX:+UseG1GC指定g1,XX:G1HeapRegionSize":设置每个Region大小

G1可以建立可预测的停顿时间模型,G1跟踪各个Region获得其收集价值大小,在后台维护一个优先列表

对象回收不进行全局扫描,通过Remembered Set来实现,有不同区域引用,当前引用放入被引用对象的Remembered Set中,gcroot时加入Remembered Set。

收集过程:

初始标记:和cms类似,且修改TAMS,让下一阶段并发运行时,应用程序在可用region创建对象

并发标记:和cms类似

再次标记:和cms类似

筛选回收:排序各个Region的回收价值和成本;根据用户设置的停顿时间设置回收计划,按计划回收价值大,进行复制算法,同时进行压缩和释放,每次只清理一部分

CAP定理中一致性、可用性和分区容错性的讲解

BASE理论:对CAP理论一致性、可用性权衡的结果,

基本可用(Basically Available)软状态(Soft State)最终一致性

你可能感兴趣的:(JVM)