搜集整理 JVM运行机制

  一般jvm大致内存分为:java栈、java堆、方法区、程序计数器、本地方法栈(有些资料上把java栈和本地方法栈归为一类)五大部分

    栈(stock)也叫栈内存,是java程序的运行区,是在线程创建时创建,它的生命周期是跟随线程的生命周期,线程结束栈内存也就结束,所以对于栈来说不存在垃圾回收问题;栈中的数据都是以栈帧的格式存在的,栈帧一个内存区块,同时也是一个有关方法和运行期数据的数据集合,当一个方法m1被调用时就产生了一个栈帧s1,并被压入到栈中,如果m1方法又调用了m2,又产生了一个s2的栈帧并被压入栈中,方法结束后,根据栈的特性先弹出栈帧s2在弹出s1;栈帧主要保存3类数据:本地变量(包括输入输出参数以及方法内运行的变量)、栈操作(记录出栈入栈的操作)、栈帧数据(类文件、方法等数据)。

    堆也叫堆内存,JVM的核心内存区,当类加载器读取了类文件后,需要把类、方法、常变量放在堆内存中,以便执行器执行,堆内存分为3个部分:新生代、年老代、永久代;新生代是类的诞生、成长、消亡的区域,新生区又分为Eden区、Survivor区,Survivor区又分为Survivor0和Survivor1区,所有的类都是在Eden区new出来的,当Eden区的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃圾回收,将Eden区的对象不可用时进行销毁,然后将Eden区的剩余对象移到Survivor0区,若Survivor0区也满了,再对该去进行垃圾回收,然后移到Survivor1区,如果该区也满了,再进行垃圾回收,回收后的剩余对象移到养老区,永久区是一个常驻内存区,用于存放JDK自身所携带的Class、Interface的元数据,也就是说它存储的是运行环境必须的类信息,该区的对象不会被垃圾回收器回收,在大量使用反射、动态代理、GCLib等的框架,都应该注意永久区溢出。

    方法区是被所有线程共享,改区域保存所有字段和方法字节码以及一些特殊方法如构造函数、接口代码也在此定义。

    程序计数器:每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。

    本地方法栈:运行native方法的栈。

    下面介绍下垃圾回收算法:

    引用计数法:给每一个对象添加一个引用计数器,没引用一次计数器加1,当计数器失效计数器减1,任何时刻计数器为0的对象就是不可能被使用的。该算法存在缺陷(无法解决对象循环引用的问题)。

    跟搜索算法:该算法思路就是通过一系列的趁为“GC Roots”的点作为起始进行向下搜索,当一个对象到GC Roots没有任何引用链相连,则证明该对象不可用。

    清除-标记算法:该算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。该算法主要有两个缺点一是效率问题,二是空间问题(碎片)。

    复制搜索算法:该算法把可用内存分为两块,每次只用其中的一块,当半区内存用完了,仅将还存活的对象复制到另一块上面,然后就把原来整块内存空间一次清理掉,这样使得每次内存回收都是对整个半区的回收,内存分配时不用考虑内存碎片等问题,该但该算法的代价是将内存缩小为原来的一半。

    分代收集算法:该算法是现在收集器的主流算法(详见上面堆内存)。

垃圾收集器分类:

    Serial收集器:单线程收集器,收集时会暂停所有工作线程,使用复制收集算法,它是虚拟机运行在Client模式时新生代的默认收集器。

    ParNew收集器:该收集器是Serial的多线程版本,它是虚拟机运行在Server模式时新生代的默认收集器。

    Parallel Scavenge收集器:它也是一个多线程的收集器,也是使用复制算法,但是他的对象分配规则和回收策略都与

Serial不同,它是以吞吐量最大化为目标的收集器实现。

    Serial old收集器:该收集器使用标记-清理算法实现,是老年代的收集器。

    Parallel old收集器:老年代版本吞吐量优先收集器,使用多线程和标记-清除算法。JDK1.6提供。

    CMS(Concurrent mark sweep)收集器:是一种以最短停顿时间为目标的收集器。

一般JVM垃圾回收有以下规则:

规则1:一般情况下,对象在eden区分配,当eden无法分配内存时,则触发一次minor GC。

规则2:配置了pretenureSizeThreadholt参数时,对象大于设置值则直接自老年代分配。

规则3:在eden区经过Gc后存活,并且survivor能容纳的对象,将移动到survivor区,如果对象在survivor中继续熬过若干次回收(默认是15次)将会被移到老年代,回收次数由MaxtenuringHold设置。

规则4:如果在survivor空间中相同年龄的所有对象的累


你可能感兴趣的:(jvm,运行机制)