Java 虚拟机

 
   

一、Java虚拟机的基本结构

①类加载子系统:从文件系统或者网络中加载Class信息,存放在方法区中。

②方法区中存放放进来的Class信息,也包括一些运行时常量池信息包括字符串字面量和数字字面量。

④java堆外的直接内存,访问速度优于Java堆。可以申请用于读写频繁的场合。不会受限于最大堆大小,但会受限于操作系统给出的最大内存。

⑥垃圾回收系统自动处理②③④的回收

⑧Java虚拟机线程都有一个私有的java栈,其中保存着帧信息,局部变量,方法参数和java方法的调用和返回密切相关。

⑨java栈用于java方法的调用,本地方法栈用于本地方法的调用。Java虚拟机支持本地方法的调用,通常本地方法用C语言完成。

⑩PC寄存器和java私有栈一样也是每个线程的私有空间。Java虚拟机会为每个线程创建一个PC寄存器。PC寄存器指向当前正在被执行的指令,不过如果当前正在被执行的方法是本地方法,PC寄存器的值就是UNDIFINED

⑦执行引擎是java虚拟机的最核心组件之一,负责执行虚拟机的字节码。

1.Java堆得结构

Java堆的结构决定于垃圾回收机制的不同而不同。常见的一种结构是新生代和老年代。

 
   

新生代存放新生对象或者年龄不大的对象,老年代则存放老年对象。新生代有可能分为eden区,s0区,s1区;s1和s0又被称为from区和to区,两块大小相等,可以互换角色的内存空间。绝大多说情况下,对象首先分配在eden区,再一次新生代回收后,如果对象还存活,就会进入s0或者s1,之后每经过一次新生代回收,对象如果存货,它的年龄就会+1.当对象的年龄达到一定条件后,就会被认为是老年对象,从而进入老年代。

Public class simpleHeap{

Private int id;

Public SimpleHeap(int id){

This.id = id;

}

Public void show(){

System.out.println(“my id is “+id);

}

Public static void main(String[] args){

SimpleHeap s1 = new SimpleHeap(1);

S1.show();

}

}

2.java栈

Java堆和程序数据密切相关,java栈和程序的调用密切相关。每次函数调用数据都是通过java栈传递的。Java栈中存放的内容为栈帧,每一次函数调用都有一个栈帧被压入栈中,函数调用结束该帧就会出栈。栈帧内保存着当前函数的局部变量,中间运算结果等数据。函数return或者发生异常就会被弹出栈。

一个栈帧中,至少包含局部变量表,操作数栈和帧数据区。

当请求的栈深度大区最大可用的栈深度时,系统刚跑出StatckOverFlowError。

①局部变量表用于保存函数的参数以及局部变量。函数调用结束,局部变量表也会消失。变量表的大小影响函数的调用层次。槽位复用!垃圾回收!System.gc().局部变量表对内存空间的强引用。

②操作数栈用于计算过程中的中间结果,同事最为计算过程中变量临时的存储空间。

③帧数据区保存着常量池的指针,方便程序访问常量池。支撑常量池解析。正常方法返回和异常处理等。异常处理表和函数返回!

④栈上分配,把线程私有的对象(不可能被其他项城访问的对象)大三分配到栈上,有利于函数调用结束后进行自行销毁,不需要垃圾回收器介入,然而是否能够进行打散分配需要进行逃逸分析。-server模式!逃逸分析!标量替换!

3.方法区

方法区是一块所用线程共享的内存区域。它用于保存系统的类信息,比如累的字段、方法、常量池等。方法区的大小决定了系统可以保存多少个类,如果系统定义了太多了类,导致方法区溢出,虚拟机同样会抛出内存溢出错误。JDK1.6和JDK1.7中的动态代理永久去大小!

在JDK1.8中永久区别彻底删除,取而代之的是元数据区可以使用-XX;maxMetaspaceSizezhiding .是一块堆外的直接内存。与永久区不同,如果不指定大小,默认情况下虚拟机会耗尽所用的可用系统内存。

二、垃圾回收算法

1.引用计数法(Reference Counting)

为每一个对象配备一个整型的的计数器,被另外一个对象每引用一次,计数器+1,引用失效则-1,计数器为0时,则对象不再被引用。

特点:无法处理循环引用的情况;引用计数器在引用的产生和消除的时候要进行加减操作对系统性能有影响。

循环引用!两对象互相引用并且引用计数器不为0,但是没有第三个对象对这两个对象的引用了,垃圾回收器无法对这两对象进行回收。

2.标记清除法

标记清除法分为标记阶段和清除阶段,标记阶段是标记从根节点出发所有从根节点的可达对象,在清除阶段清除我被标记的对象。

特点:会产生空间碎片问题,因为对象空间的回收是不连续的,而在堆空间的分配中不连续的空间分配在大对象的空间分配中的效率是低于连续空间的。

3.复制法

复制法的思想是把内存空间分为两块,分配空间时使用其中的一块,在垃圾回收时把正在使用的存活对象复制到另一块中并清空原来的一块。完成角色的互换。

特点:高效性用在存活对象小,垃圾对象多的情况下。确保回收后的内存空间是没有碎片的,但是代价是系统内存折半。

Java中新生代串行垃圾回收器。From块和to块!

Java中新生代串行垃圾回收器。From块和to块!

4.标记压缩法

(标记清除压缩法:进行一次标记清除法后再进行一次碎片整理)

标记压缩法是一种老年代的回收算法,它是标记从根节点开始的可达对象,并把这些存活对象压缩到内存的一端,然后清除边界外的垃圾对象。

特点:既不会像标记清除法那样产生空间碎片又不会像复制法那样折半消耗系统内存。

5.分代算法

分代算法主要是因为对象的使用频率和回收频率不同的特性进行制定的,对于新对象很大可能会被回收,而对于老对象很有可能是永久内存。但是复制法和标记压缩和标记清除等对这两种情况展现不同的特性。所以把内存空间分为新生代和老年代。新生代用复制法进行垃圾回收,老年代使用标记清除或者标记压缩进行垃圾回收。

但是,在新生代的垃圾回收中的频率较高,有根据老年代的回收频率较低,所以为了支持高频率的新生代回收,引入了卡表(Card Table)的功能。

卡表是指bit集合,每一位标识老年代中的对象是否含有对新生代中对象的引用。在新生代的垃圾回收中,首先便利卡表,对没被老年代对象引用的新生代对象进行垃圾回收。

6.分区算法

与分代算法将不同生命周期的对象分成两部分不同,分区算法是将内存空间分成连续不同的小空间,每个小空间都独立使用和回收。因为程序的停顿时间和回收的内存空间的大小成正比,所以为了控制停顿时间把要回收的内存空间的单位进行缩小。

特点:可以控制一次回收多少个小空间。

三、垃圾收集器和内存分配

1.串行回收器(一心一意一件事)

串行回收器指用单线程进行垃圾回收的回收器,每次回收时只有一个回收线程。适用于并行能力较弱的计算机。

特点:仅仅使用单线程进行垃圾回收;是独占试的垃圾回收。

-XX:+UserSerialGC,新生代和老年代都是用串行回收器

2.并行回收器(人多力量大)

使用多个线程同时进行垃圾回收。

特点:在高性能计算机上面进行并行垃圾回收,大大缩短了垃圾回收的时间!

① ParNew回收器是简单的将串行回收器进行多线程化。

-XX:+UseParNewGC

-XX:+UseParNewThreads:指定并行 线程数量,一般与cpu数量相同,当cpu数量多于8个时为:3+((5*CPU_COUT)/8)。

② 新生代ParallelGC回收器

它是使用复制算法的收集器,关注系统的吞吐量。

-XX:+UseParallelGC:新生代使用ParallelGC回收器,老年代使用串行回收器。

-XX:+UseParallelOldGC:新生代使用ParallelGC回收器,老年代使用ParallelOldGC回收器。

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿的时间。

-XX:GCTimeRatio:设置吞吐量的大小。默认情况下,吞吐量的值为99用1/(1+99)=1%,系统用不超过1%的时间用于垃圾收集。

ParallelGC和ParNew回收器支持一种自适应的GC调节策略。使用-xx:+UseAdaptiveSizePolicy可以代开自适应GC策略。在这种模式下新生代的大小、eden和surivivior的比例、晋升老年代的对象年龄等参数会被自动调整。以达到在堆大小、吞吐量和停顿时间之间的衡点。

③ 老年代ParallelOldGC回收器

ParallelOldGC回收器使用标记压缩算法,它在JDK1.6中才可以使用。其他和ParallelGC回收器一样是一种多线程并发的收集器。

3.CMS回收器(并发标记清除回收器Concurrent Mark Sweep)

CMS回收器的工作过程与其他垃圾收集器相比比较复杂,主要步骤有初始标记、并发标记、预处理、重新标记、并发清理、并发重置。

初始标记,并发标记和重新标记都是为了标记处需要回收的对象,并发清理则是在标记完成后,正是回收垃圾对象。并发重置是指在垃圾回收完成后,重新初始化CMS数据结构和数,为下一次垃圾回收做好准备。并发标记,并发清理和并发重置都是可以和应用程序线程一起执行的。

1.G1回收器(Garbage-First)

是JDK1.7中亨氏使用的全新的垃圾回收器,取代了CMS回收器。

① 特点:

并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。

并发性:G1拥有与应用呈交替执行的能力

分代GC:同时兼顾年轻代和老年代

空间整理:G1在回收过程中,会进行适当的对象移动吗,不像CMS只是简单的标记清理对象,在若干次GC后,CMS必须进行一次碎片整理。而G1不同,它每次回收都会有效地复制对象,减少空间碎片。

可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收的范围,因此对于全局停顿也能得到较好的控制。

② G1的内存划分和主要收集过程

G1收集器将堆进行分区,划分为一个个的区域,每次手机的时候,纸手机器中几个区域,以此来控制垃圾回收产生的一次停顿。

③ G1的收集过程可能有4个阶段:

新生代GC,并发标记周期,混合收集,如果需要,可能会今夕Full GC。

1)新生代GC:和其他收集算法相似,会复制eden区和suivivor区,另外是G1老年代的区域增多,为部分eden区和survivor区晋升到老年代。

2)并发标记周期:G1的并发标记周期和CMS有点类似,他们都是为了降低一次停顿时间,而将可以和应用程序并发的部分单独提取出来执行。初始标记,根区域扫描,并发标记,重新标记,独占清理,并发清理阶段,

初始标记,伴随一次新生代GC。并发根区域扫描过程中不能被xinshengdaiGC打断。并发标记可以被新生代GC打断。重新标记会引起全局停顿。独占清理会重新计算各个区域的存活对象并以此可得到每个区域进行GC的效用。并发清理时并发执行的,它会根据独占清理阶段得出的每个区域的存活对象数量直接回收已经不包含存活对象的区域。

③ 混合回收

在并发标记周期阶段,对象被回收的比例还是很小的,但在并发周期之后,G1就会明确知道哪些区含有比较多的垃圾对象,在混合回收阶段可以专门针对这些区域进行回收。G1会优先回收垃圾比例较高的区域,因为回收这些区域的性价比也比较高。

④ full GC

和CMS类似,并发手机优于让应用程序和GC线程交替工作,因此总是不能完全避免在特别繁忙的场合会出现在回收过程中内存不足的情况。当遇到这种情况时,G1也会转入一个FUllGC进行回收。

内存分配

TLAB上分配对象,线程本地分配缓存。线程专属的区间,TLAB启用的情况下,虚拟机会为每一个java线程分配一块TLAB的空间。

        对象分配的简要流程

Java虚拟机——进度1的更多相关文章

  1. 深入理解java虚拟机【Java虚拟机垃圾收集器】

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  2. (转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  3. 深入Java虚拟机(2)——Java的平台无关性

    一.平台无关性的好处 Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台. 这样的平台无关性随之带来许多的好处.这将极大地减轻系统管理 ...

  4. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  5. 《深入理解Java虚拟机》-----第4章 虚拟机性能监控与故障处理工具

    理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是 我们的最终目的. 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异 ...

  6. 深入理解 Java 虚拟机——走近 Java

    1.1 - 概述 Java 总述:Java 不仅是一门编程语言,还是一个由一系列 计算机软件 和 规范 形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...

  7. Java虚拟机(二)对象的创建与OOP-Klass模型

    前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案. 1.对象的创建 对象的 ...

  8. 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)

    前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...

  9. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

随机推荐

  1. windbg 之 如何设置模块加载时断下

    这里先介绍两个指令: sx指令: The sx* commands control the action that the debugger takes when an exception occur ...

  2. linux中服务器定时程序设定

    服务器不重启的情况下定时自动重启apache及mysql服务,其实也大同小异.具体步骤如下:  一.每天的12点及16点重启apache及mysql服务 [root@www bin]# cd /opt ...

  3. 高性能web开发:如何加载js,,js的存放位置

    外部JS的阻塞下载 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.至到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 有人会问:为什么JS不能像 ...

  4. html5中拨打电话代码

    <a href="tel:18600000000">给我打电话</a>   <a href="sms:18600000000"&g ...

  5. C#入门经典(3-窗体应用程序-第二章要点)

    新建一个窗体用用程序,拖一个按钮,加事件和Text属性.打开Form1Designer.cs.

  6. jQuery常用及基础知识总结(二)

    JQuery Effects 方法说明 show( ) 显示隐藏的匹配元素.show( speed, [callback] ) 以优雅的动画显示所有匹配的元素,并在显示完成后可选地触发一个回调函数.h ...

  7. struts1.x中web.xml文件的配置

    1.配置欢迎文件清单      当客户访问Web应用时,如果仅仅给出Web应用的Root URL,没有指定具体的文件名.Web容器会自动调用Web应用的欢迎文件.<welcome-file-li ...

  8. java dom4j解析xml实例(3)

    代码运行前需要先导入dom4j架包. 需要解析的XML文件test.xml如下: <students> <student age="25"><!--如 ...

  9. loadView 再思考

    如果使用代码创建view,那么就需要重写loadView方法: 在这个方法中,如果不创建view,就会循环的调用loadView. - (void)loadView { UIView *view = ...

  10. 一键生成JNI头文件方法二

    经常使用java的同学一定都接触过JNI(Java Native Interface)吧.JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以 ...