java虚拟机的自动内存管理机制(一)
1.java虚拟机运行时数据区
a.程序计数器:
是当前线程所执行的字节码的行号指示器.如果是执行虚拟机字节码,则记录的是指令的地址
如果执行的是Native方法,计数器为空(Undefined).
计数器是线程私有的
b.java虚拟机栈:
线程私有的
生命周期和线程相同,每个方法执行的时候会创建栈帧,用于储存局部变量,操作数栈,动态链接等,一个方法
从调用到执行完毕的过程,就是一个栈帧在虚拟机栈中入栈到出栈的过程
当前的大部分虚拟机都可以动态扩展栈内存
c.本地方法栈:
和虚拟机栈的作用相似,只不过是java虚拟机栈执行java方法,本地方法栈执行Native方法.
在HotSpot虚拟机中,没有本地方法栈,虚拟机栈实现其功能
d.java堆:
大多数应用来说,是java虚拟机管理内存最大的一块.被所有线程共享的内存区域,用于存放对象实例和数组
e.方法区:
线程共享的区域,用来存储被虚拟机加载的类信息,常量,静态变量,运行时常量池等
2.判断对象的存活:
a.引用计数器,难以解决相互引用的问题,很少用
b.可达性分析算法.对象到GC roots没有引用链相连接,即在图上不可达.为可回收对象.
进行可达性分析时,即GC时必须停顿所有Java线程(Stop The World)
3.垃圾收集算法:
a.标记-清除算法.分两个阶段,线标记需回收的对象,,然后统一回收标记对象.存在,空间碎片的问题
b.复制算法:将内存划分为相等的两块,每次只使用一块,当一块用完了,将存活的对象复制到另一块内存
把剩余的清理掉.缺点,有效内存减少为原来的一半
一般用来回收新生代.
c.标记-整理算法:标记-清理算法的改进,标记完,将存活的对象向一端移动,清理边界外的内存,一般用于老年代回收
d.分代收集算法:按存活的时间,将对象划分为新生代和老年代.分别采用不同的收集算法
4.垃圾收集器:
Serial收集器:单线程.复制算法.Client模式下默认的新生代收集器,优点,简单高效,无线程切换
(在启动JVM时,如果不指定.JVM会自动判断,启动Client模式还是Server模式.Server模式启动慢,但运行起 来后,性能远好于Client模式.java -version查看JVM运行的模式)
ParNew收集器:复制算法.Serial收集器的多线程版本,在Server模式下,首选的新生代收集器.
Parallel Scavenge收集器,是新生代收集器,复制算法实现,并行的多线程收集器,关注吞吐量
Serial Old收集器:单线程.Serial收集器的老年代版本
Parallel Old收集器:Parallel Scavenge收集器的老年代收集器版本
CMS收集器:获取最短停顿时间为目标的收集器.(并发收集,低停顿).基于标记-清除算法
G1收集器:
特点:
a.并行与并发
b.分代收集
c.空间整合(基于标记-整理算法实现)
d.可预测的停顿(可以设置最大停顿时间)