JVM内存模型

今天发现了一个JVM内存模型不错的网址,在此分享,以供更多人学习: http://www.javashuo.com/article/p-tloibpbz-ew.htmlhtml

程序猿的平常——JVM内存模型与垃圾回收 Java开发有个很基础的问题,虽然咱们平时接触的很少,可是了解它却成为Java开发的必备基础——这就是JVM。在C++中咱们须要手动申请内存而后释放内存,不然就会出现对象已经再也不使用内存却仍被占用的状况。在Java中JVM内置了垃圾回收的机制,帮助开发者承担对象的建立和释放的工做,极大的减轻了开发的负担。那是否是咱们就不须要了解JVM了,显然在作一些优化或者深刻研究应用性能的时候,JVM仍是起了很关键的做用的。所以本篇就总结性的描述下JVM的内存模型与垃圾回收相关的知识。java

本文的主要内容以下:算法

内存模型 垃圾回收 参考文章 内存模型多线程

各部分的功能 这几个存储区最主要的就是栈区和堆区,那么什么是栈什么是堆呢?说的简单点,栈里面存放的是基本的数据类型和引用,而堆里面则是存放各类对象实例的。并发

堆与栈分开设计是为何呢?性能

栈存储了处理逻辑、堆存储了具体的数据,这样隔离设计更为清晰 堆与栈分离,使得堆能够被多个栈共享。 栈保存了上下文的信息,所以只能向上增加;而堆是动态分配 栈的大小能够经过-XSs设置,若是不足的话,会引发java.lang.StackOverflowError的异常学习

栈区 线程私有,生命周期与线程相同。每一个方法执行的时候都会建立一个栈帧(stack frame)用于存放 局部变量表、操做栈、动态连接、方法出口。优化

存放对象实例,全部的对象的内存都在这里分配。垃圾回收主要就是做用于这里的。.net

堆得内存由-Xms指定,默认是物理内存的1/64;最大的内存由-Xmx指定,默认是物理内存的1/4。 默认空余的堆内存小于40%时,就会增大,直到-Xmx设置的内存。具体的比例能够由-XX:MinHeapFreeRatio指定 空余的内存大于70%时,就会减小内存,直到-Xms设置的大小。具体由-XX:MaxHeapFreeRatio指定。 所以通常都建议把这两个参数设置成同样大,能够避免JVM在不断调整大小。线程

程序计数器 这里记录了线程执行的字节码的行号,在分支、循环、跳转、异常、线程恢复等都依赖这个计数器。

方法区 类型信息、字段信息、方法信息、其余信息

总结

名称 特征 做用 配置 异常 栈区 线程私有,使用一段连续的内存空间 存放局部变量表、操做栈、动态连接、方法出口 -XSs StackOverflowError OutOfMemoryError 堆 线程共享,生命周期与虚拟机相同 保存对象实例 -Xms -Xmx -Xmn OutOfMemoryError 程序计数器 线程私有、占用内存小 字节码行号 无 无 方法区 线程共享 存储类加载信息、常量、静态变量等 -XX:PermSize -XX:MaxPermSize OutOfMemoryError 垃圾回收 如何定义垃圾 有两种方式,一种是引用计数(可是没法解决循环引用的问题);另外一种就是可达性分析。

判断对象能够回收的状况

显示的把某个引用置位NULL或者指向别的对象 局部引用指向的对象 弱引用关联的对象 垃圾回收的方法 Mark-Sweep标记-清除算法

这种方法优势就是减小停顿时间,可是缺点是会形成内存碎片。

Copying复制算法

这种方法不涉及到对象的删除,只是把可用的对象从一个地方拷贝到另外一个地方,所以适合大量对象回收的场景,好比新生代的回收。

Mark-Compact标记-整理算法

这种方法能够解决内存碎片问题,可是会增长停顿时间。

Generational Collection 分代收集 最后的这种方法是前面几种的合体,即目前JVM主要采起的一种方法,思想就是把JVM分红不一样的区域。每种区域使用不一样的垃圾回收方法。

上面能够看到堆分红三个区域

新生代(Young Generation):用于存放新建立的对象,采用复制回收方法,若是在s0和s1之间复制必定次数后,转移到年老代中。这里的垃圾回收叫作minor GC; 年老代(Old Generation):这些对象垃圾回收的频率较低,采用的标记整理方法,这里的垃圾回收叫作 major GC。 永久代(Permanent Generation):存放Java自己的一些数据,当类再也不使用时,也会被回收。 这里能够详细的说一下新生代复制回收的算法流程:

在新生代中,分为三个区:Eden, from survivor, to survior。

当触发minor GC时,会先把Eden中存活的对象复制到to Survivor中; 而后再看from survivor,若是次数达到年老代的标准,就复制到年老代中;若是没有达到则复制到to survivor中,若是to survivor满了,则复制到年老代中。 而后调换from survivor 和 to survivor的名字,保证每次to survivor都是空的等待对象复制到那里的。 垃圾回收器

串行收集器 Serial 这种收集器就是以单线程的方式收集,垃圾回收的时候其余线程也不能工做。

并行收集器 Parallel 以多线程的方式进行收集

并发标记清除收集器 Concurrent Mark Sweep Collector, CMS 大体的流程为:初始标记--并发标记--从新标记--并发清除

G1收集器 Garbage First Collector 大体的流程为:初始标记--并发标记--最终标记--筛选回收

参考 JVM内存模型:http://developer.51cto.com/art/200911/165015.htm 垃圾回收:http://www.importnew.com/19085.html JVM垃圾回收器:http://www.cnblogs.com/chengxuyuanzhilu/p/7088316.html 内存模型: http://blog.csdn.net/u012152619/article/details/46968883

相关文章
相关标签/搜索