理解JVM机
JAVASE:面向桌面应用开发
JAVAEE:面向企业级开发
JAVAME:面向手机等移动终端开发
JAVA 8中新增:函数式编程-->Lambda表达式
JVM机体系结构
1.类加载器:加载.class文件
2.执行引擎:执行字节码或者本地方法
3.运行时数据区
JVM虚拟机运行时的数据区:
1.方法区
2.虚拟机栈(JAVA栈)
3.本地方法栈
4.堆
5.程序计数器
6.PC寄存器
PC寄存器:用于存储每个线程下一步将执行的JVM指令;
栈:栈是线程私有的,每个线程创建的同时都会创建的同时都会创建JVM栈,JVM栈中存放当前线程中的局部基本类型的变量;
堆:它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。堆是JVM所有线程共享的。
方法区:存放了所加载的类信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息;通过class对象中的getName等方法来获取信息时,实际这些数据是来源于方法区,方法区是全局共享的。
运行时常量池:存放类中固定的常量信息、方法和Field的引用信息等,其空间是从方法区中分配。
本地方法栈:JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
JVM机之PC寄存器:
1.PC寄存器( PC register ):
每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。
保存下一条将要执行的指令地址的寄存器是 :PC寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
2.每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。
3.这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
4.如果执行的是一个Native方法,那这个计数器是空的
GC的作用区域:堆,方法区
JVM垃圾回收:
对新生代的对象的收集称为minor GC;
对老年代的对象的收集称为full GC;
程序中主动调用System.gc()强制执行的GC为full GC;
强引用:默认情况下,对象采用的均为强引用;
软引用:适用于缓存场景(只有在内存不够用的情况下才会被回收)
弱引用:在GC时一定会被GC回收
虚引用:用于判断对象是否被GC
垃圾收集算法:
标记—清除算法:有两点不足,一个效率问题,标记和清除过程都效率不高;一个是空间问题,标记清除后会产生大量不连续的内存碎片;
复制算法:解决了内存碎片问题,但是内存利用率低;
标记整理算法:解决了内存碎片问题
分代收集算法:
新生代:每次GC时都会有大量对象死去,少量存活,使用复制算法;新生代又分为Eden区、Survivor(Survivor from、Survivor to)大小比例默认为8:1:1;
JVM给每个对象定义一个对象年龄计数器,乳沟对象在Eden出生并经过第一个Minor GC后仍然存活,并且能被Survivor容纳,将被移入Survivor并且年龄设定为1.每熬过一次Minor GC,年龄就加1,当它的年龄到了一定程度(默认15岁,可以通过XX:MaxTenuringThreshold来设定),就会移入老年代;
如果Survivor相同年龄所有对象大小的总和大于Survivor的一半,年龄大于等于x的所有对象直接进入老年代,无需等到最大年龄要求。
老年代:老年代中的对象存活率高、没有额外空间进行分配,就是用标记—清除或标记—整理算法;大对象可以直接进入老年代,JVM可以配置对象达到阈值后进入老年代的大小(-XX:PretenureSizeThreshold)
垃圾收集器:
Serial收集器:是最基本、历史最久的收集器,单线程,并且在收集是必须暂停所有的工作线程;
ParNew收集器:是Serial收集器的多线程版本;
Parallel Scavenge收集器:新生代收集器,并行的多线程收集器。它的目标是达到一个可控的吞吐量,这样可以高效率的利用CPU时间,尽快完成程序的运算任务,适合在后台运算;
Serial Old收集器:Serial 收集器的老年代版本,单线程,主要是标记—整理算法来收集垃圾;
Parallel Old收集器:Parallel Scavenge的老年代版本,多线程,主要是标记—整理算法来收集垃圾;Parallel Old 和 Serial Old 不能同时搭配使用,后者性能较差发挥不出前者的作用;
CMS收集器:收集器是一种以获取最短回收停顿时间为目标的收集器;基于标记清除算法,并发收集、低停顿、运作过程复杂(初始标记、并发标记、重新标记、并发清除)。CMS收集器有3个缺点:1。对CPU资源非常敏感(占用资源);2。无法处理浮动垃圾(在并发清除时,用户线程新产生的垃圾叫浮动垃圾),可能出现“Concurrent Mode Failure”失败;3。产生大量内存碎片
G1收集器:
特点:
分代收集,G1可以不需要其他GC收集器的配合就能独立管理整个堆,采用不同的方式处理新生对象和已经存活一段时间的对象;
空间整合:采用标记整理算法,局部采用复制算法(Region之间),不会有内存碎片,不会因为大对象找不到足够的连续空间而提前触发GC;
可预测的停顿:能够让使用者明确指定一个时间片段内,消耗在垃圾收集上的时间不超过时间范围内;

浙公网安备 33010602011771号