JVM的简要总结

1、JVM的内存运行机制(重点)
JVM栈由堆、方法区、虚拟机栈、本地方法栈、程序计数器等部分组成;
<1>程序计数器:
每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,如果线程正在执行的是Native方法,这个计数器的值则为空。
<2>栈:
其中栈包括java虚拟机栈和本地方法栈,虚拟机栈是虚拟机执行的java代码来服务,本地方法栈是执行被Native关键字修饰的代码服务;
栈里面存放了编译器可知的各种基本数据类型、对象引用和指向了一条字节码指令的地址,栈的特点是先进后出;
<3>堆内存:
堆是Java虚拟机所管理的内存中最大的一块,这个内存区域就是存放对象实例的,几乎所有的对象实例都在这里分配内存;
而且堆是垃圾收集器管理的主要区域:从内存回收的角度来看,java堆中还可以细分为新生代和老年代,其中新生代在细致一点划分有Eden空间、FromSurvivor空间、To Survivor空间;
在实现时,既可以实现成固定大小,也可以是可扩展的,不过现在主流的虚拟机都是按照可扩展来实现的(通过-Xmx设置最大内存和-Xms设置初始内存);
<4>方法区:
方法区也叫静态区,用来存储已被虚拟机加载的类信息、常量池、静态变量等数据;
对于HotSpot虚拟机(目前使用最广的一种虚拟机)使用永久代来实现方法区;
相对于堆内存而言,垃圾收集器行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,而且条件相当的苛刻;
本来这个常量池技术,就是为了方便快捷的创建某些对象而出现的,当需要一个对象时,就可以从池中取出一个出来(如果没有就创建一个),在需要重复创建相等变量时节省了很多的时间。

2、JVM垃圾回收器->垃圾对象的清理方式/GC的方式(重点)
最基础的收集算法是"标记-清除"算法,这个方法分为两个阶段:标记、清除,主要是通过标记要清除的对象,然后统一清除,但是这种算法存在两点不足:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次的垃圾回收;
第二种是对标记-清除算法的升级,在此之上多了一步整理,将垃圾回收后的可用空间整理成连续的内存空间,以便容纳更大的对象,解决了标记-清除算法的空间不足的问题;
第三种是复制算法,它是将可用的内存按容量划分为大小相等的两块,每次只使用其中的一块,当这块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过内存空间一次全部清理掉,这种算法的优点是:无内存碎片,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效;但缺点是:实际可用内存缩小为原来的一半;
现在的虚拟机都采用这种收集算法来回收新生代:
<1>将内存分为一块较大Eden空间和两块较小的Survivor空间;
<2>每次使用Eden和其中一块Survivor;
<3>当垃圾回收时,将Eden和Survivor中还存活着的对象一次性的全部复制到另一块Survivor空间上,并清理掉Eden和刚才使用过的Survivor空间;
HotSpot虚拟机默认Eden和Survivor的大小比例是8:1:1,浪费了10%的空间,以空间来换时间。

GC的三种方式:
<1>Minor GC:从新生代空间(包括Eden和Survivor)回收内存,每次Minor GC会清理新生代的内存
<2>Major GC:清理老年代和永久代
<3>Full GC:清理整个堆空间,包括新生代、老年代或者永久代

3、内存的分配策略(重点)
大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC,此时对象会进入Survivor区域,当对象满足一些条件后就会进入老年代。
进入老年代的三种方式:
<1>当对象的年龄达到15(默认值)之后,就会从新生代进入到老年代;
<2>在Survivor中相同年龄的对象总大小大于Survivor空间的一半,年龄大于等于该年龄的对象,集体晋升到老年代
<3>大对象直接进入老年代,这么做的目的是避免Eden区和两个Survivor区之间发生大量的内存复制;
垃圾回收的对象空间担保问题(就是本次的GC是否安全):
<1>在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代的所有对象总空间,如果这个条件成立,那么本次GC可以确保是安全的;
<2>如果不成立,虚拟机会查看是否允许担保失败,如果允许,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次GC是有风险的,如果小于,则直接进行Full GC;
<3>如果不允许担保失败,则直接执行Full GC;

4、垃圾收集器
两个概念:
并行:指多条垃圾收集线程并行工作,但是此时:用户线程仍然处于线程等待状态。
并发:指用户线程和垃圾收集线程同时执行,用户程序在继续运行,而垃圾收集程序运行于另一个cpu上。

常见的垃圾收集器:
<1>Serial:最基础的适合新生代的收集器,特点是单线程、复制算法,由于Serial收集器没有线程交互的开销,所以效率比较高,对运行在client模式下的虚拟机来说,这个Serial收集器比较好;
<2>ParNew:其实是Serial的一个多线程版本,在多个CPU的环境下,效果比Serial好,这个适用于Server模式下;
<3>CMS:这是一个老年代的收集器,通过标记-清除算法实现的,过程复杂一些,它的停顿时间短,但是吞吐量低,未来的话可能G1会替代CMS收集器吧;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值