1.程序计数器:一块较小内存区域,指向当前所执行的字节码。若是线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,若是执行的是Native方法,这个计算器值为空。javascript
2.Java虚拟机栈:线程私有的,其生命周期和线程一致,每一个方法执行时都会建立一个栈帧用于存储局部变量表、操做数栈、动态连接、方法出口等信息。html
3.本地方法栈:与虚拟机栈功能相似,只不过虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的Native方法服务。java
4.Java堆:是虚拟机管理内存中最大的一块,被全部线程共享,该区域用于存放对象实例,几乎全部的对象都在该区域分配。Java堆是内存回收的主要区域,从内存回收角度看,因为如今的收集器大都采用分代收集算法,因此Java堆还能够细分为:新生代和老年代,再细分一点的话能够分为Eden空间、From Survivor空间、To Survivor空间等。根据Java虚拟机规范规定,Java堆能够处于物理上不连续的空间,只要逻辑上是连续的就行。算法
5.方法区:与Java同样,是各个线程所共享的,用于存储已被虚拟机加载类信息、常亮、静态变量、即时编译器编译后的代码等数据。markdown
6.运行时常量池,运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各类字面量和符号引用。运行期间能够将新的常量放入常量池中,用得比较多的就是String类的intern()方法,当一个String实例调用intern时,Java查找常量池中是否有相同的Unicode的字符串常量,如有,则返回其引用;若没有,则在常量池中增长一个Unicode等于该实例字符串并返回它的引用。app
普遍地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation)。jvm
年轻代是全部新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫作Minor GC。年轻代被分为3个部分——Enden区和两个Survivor区。ide
大多数新建的对象都位于Eden区。
当Eden区被对象填满时,就会执行Minor GC。并把全部存活下来的对象转移到其中一个survivor区。
Minor GC一样会检查存活下来的对象,并把它们转移到另外一个survivor区。这样在一段时间内,总会有一个空的survivor区。
通过屡次GC周期后,仍然存活下来的对象会被转移到年老代内存空间。一般这是在年轻代有资格提高到年老代前经过设定年龄阈值来完成的。this
年老代内存里包含了长期存活的对象和通过屡次Minor GC后依然存活下来的对象。一般会在老年代内存被占满时进行垃圾回收。老年代的垃圾收集叫作Major GC。Major GC会花费更多的时间。线程
全部的垃圾收集都是“Stop the World”事件,由于全部的应用线程都会停下来直到操做完成(因此叫“Stop the World”)。
由于年轻代里的对象都是一些临时(short-lived )对象,执行Minor GC很是快,因此应用不会受到(“Stop the World”)影响。
Java堆中存放着几所全部的对象实例,垃圾收集器在对堆进行回收前,首先须要肯定哪些对象还”活着”,哪些已经”死亡”,也就是不会被任何途径使用的对象。
引用计数法实现简单,效率较高,在大部分状况下是一个不错的算法。其原理是:给对象添加一个引用计数器,每当有一个地方引用该对象时,计数器加1,当引用失效时,计数器减1,当计数器值为0时表示该对象再也不被使用。须要注意的是:引用计数法很难解决对象之间相互循环引用的问题,主流Java虚拟机没有选用引用计数法来管理内存。
这个算法的基本思路就是经过一系列的称为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来讲,就是从GC Roots到这个对象不可达)时,则证实此对象是不可用的。如图所示,对象object 五、object 六、object 7虽然互相有关联,可是它们到GC Roots是不可达的,因此它们将会被断定为是可回收的对象。
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即通常说的Native方法)引用的对象。
即便在可达性分析算法中不可达的对象,也并不是是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:若是对象在进行可达性分析后发现没有与GC Roots相链接的引用链,那它将会被第一次标记而且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种状况都视为“没有必要执行”。程序中能够经过覆盖finalize()来一场”惊心动魄”的自我拯救过程,可是,这只有一次机会。
不管是经过引用计数算法判断对象的引用数量,仍是经过可达性分析算法判断对象的引用链是否可达,断定对象是否存活都与“引用”有关。
在JDK 1.2之前,Java中的引用的定义很传统:若是reference类型的数据中存储的数值表明的是另一块内存的起始地址,就称这块内存表明着一个引用。
将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。
就是指在程序代码之中广泛存在的,相似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
是用来描述一些还有用但并不是必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常以前,将会把这些对象列进回收范围之中进行第二次回收。若是此次回收尚未足够的内存,才会抛出内存溢出异常。在JDK 1.2以后,提供了SoftReference类来实现软引用。
也是用来描述非必需对象的,可是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生以前。当垃圾收集器工做时,不管当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2以后,提供了WeakReference类来实现弱引用。
也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,彻底不会对其生存时间构成影响,也没法经过虚引用来取得一个对象实例。为一个对象设置虚引用关联的惟一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2以后,提供了PhantomReference类来实现虚引用。
这是最基础的垃圾回收算法,之因此说它是最基础的是由于它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出全部须要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。具体过程以下图所示:
从图中能够很容易看出标记-清除算法实现起来比较容易,可是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会致使后续过程当中须要为大对象分配空间时没法找到足够的空间而提早触发新的一次垃圾收集动做。
为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面,而后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。具体过程以下图所示:
这种算法虽然实现简单,运行高效且不容易产生内存碎片,可是却对内存空间的使用作出了高昂的代价,由于可以使用的内存缩减到原来的一半。
很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,若是存活对象不少,那么Copying算法的效率将会大大下降。
为了解决Copying算法的缺陷,充分利用内存空间,提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep同样,可是在完成标记以后,它不是直接清理可回收对象,而是将存活对象都向一端移动,而后清理掉端边界之外的内存。具体过程以下图所示:
分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不一样的区域。通常状况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特色是每次垃圾收集时只有少许对象须要被回收,而新生代的特色是每次垃圾回收时都有大量的对象须要被回收,那么就能够根据不一样代的特色采起最适合的收集算法。
目前大部分垃圾收集器对于新生代都采起Copying算法,由于新生代中每次垃圾回收都要回收大部分对象,也就是说须要复制的操做次数较少,可是实际中并非按照1:1的比例来划分新生代的空间的,通常来讲是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间(通常为8:1:1),每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另外一块Survivor空间中,而后清理掉Eden和刚才使用过的Survivor空间。
而因为老年代的特色是每次回收都只回收少许对象,通常使用的是Mark-Compact算法。
来自以下两篇博客的总结
http://www.cnblogs.com/luoxn28/p/5492840.html
http://www.importnew.com/14086.html