java虚拟机JVM学习,含思维导图

JVM学习

思维导图

虚拟机

  • 所谓虚拟机,就是一台虚拟的机器。它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机程序虚拟机。大名鼎鼎的Visual Box、VMare就属于系统虚拟机,他们完全对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

  • Java虚拟机的基本结构

        JVM结构.png

JVM基本结构

说明

类加载子系统

负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。

方法区

就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。

Java堆

在Java虚拟机启动的时候建立Java堆,它是Java程序最主要内存工作区域,几乎所有的对象实例都存放到Java堆中,堆空间是所有线程共享的。

直接内存

Java的NIO库允许Java程序使用直接内存,从而提高性能,通常直接内存速度会优于Java堆。读写频繁的场合可能会考虑使用。

Java栈

每个虚拟机线程都有一个私有的栈,一个线程的Java栈在线程创建的时候被创建,Java栈中保存着局部变量,方法参数、同时Java的方法调用、返回值等。

本地方法栈

本地方法栈和Java栈非常相似,最大不同为本地方法栈用于本地方法调用。Java虚拟机允许Java直接电泳本地方法(通常使用C编写)

垃圾回收系统

垃圾收集系统是Java的核心,也是必不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需手工清理。

PC寄存器

PC(Program Counter)寄存器也是每个线程私有的空间,Java虚拟机会为每个线程创建PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器值为undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。

执行引擎

虚拟机最核心的组件就是执行引擎了,它负责执行虚拟机的字节码,一般会先进行编译成机器码后执行。

 

虚拟机参数

  • 在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助。为此,虚拟机提供了一些跟踪系统状态的参数,使用给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。我们进行虚拟机参数配置,其实主要就是围绕着堆、栈、方法区进行配置。

 

垃圾回收及其算法

  • 谈到垃圾回收(Garbage Collection,简称GC),需要先清楚什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾桶,然后倒掉。GC中的垃圾,特指存在于内存中、不会再被使用的对象,而回收就是相当于把垃圾"倒掉"。

  • 垃圾回收有很多种算法:如引用计数法、可达性分析、标记压缩法、复制算法、分代、分区的思想。

JVM垃圾回收算法

说明

引用计数法

这是个比较古老而经典的垃圾收集算法,其核心就是在对象被其他所引用时计数器加1,而当引用失效时则减1,但是这种方式有非常严重的问题:无法处理循环引用的情况、还有就是每次进行加减操作比较浪费系统性能。

可达性分析法

为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法。通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。

标记清除法

就是分为标记清除两个阶段进行处理内存中的对象,当然这种方式也有非常大的弊端,就是空间碎片问题,垃圾回收后的空间是不连续的,不连续的内存空间的工作效率要低于连续的内存空间。

复制算法

其核心思想就是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存留对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存角色,完成垃圾收集。(Java中新生代的from和to空间就是使用这个算法)

标记压缩法

标记压缩法在标记清除法的基础之上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。(Java中老年代使用的就是标记压缩法)

分代算法

就是根据对象的特点把内存分成N块,而后根据每个内存的特点使用不同的算法。

对于新生代和老年代来说,新生代回收频率很高,但是每次回收耗时很短。

老年代回收频率很低,但是耗时会相对较长,所以应该尽量减少老年代的GC。

分区算法

其主要就是将整个内存分为N多个小的独立空间,每个小空间都可以独立使用,说这样细粒度的控制一次回收多少个小空间和哪些小空间,而不是对整个空间进行GC,从而提升性能,并减少GC的停顿时间。

 

垃圾回收时的停顿现象

  • 垃圾回收器的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以高效的执行,大部分情况下,会要求系统进入一个停顿的状态。停顿的目的是终止所有应用线程,只有这样系统才不会有新的垃圾产生。同时停顿保证了系统状态在某一个瞬间的一致性,也有益于更好低标记垃圾对象。因此在垃圾回收时,都会产生应用程序的停顿。

 

对象如何进入老年代

  • 一般而言对象首次创建会被放置在新生代的eden区,如果没有GC介入,则对象不会离开eden区,那么eden区的对象如何进入老年代呢?一般来讲,只要对象的年龄达到一定的大小,就会自动离开新生代进入老年代,对象年龄是由对象经历数次GC决定的,在新生代每次GC之后如果对象没有呗回收则年龄加1.虚拟机提供了一个参数来控制新生代对象的最大年龄,当超过这个年龄范围就会晋升老年代。  -XX:MaxTenuringThreshold,默认情况下为15

 

垃圾收集器

  • 在Java虚拟机中,垃圾回收器不仅仅只有一种,什么情况下该使用哪种,对性能又有什么样的影响,这都是我们需要了解的。

  • 垃圾收集器有:串行垃圾回收器并行垃圾回收器CMS回收器G1回收器

 

G1回收器

  • G1回收器(Garbage-First)是在jdk1.7中提出的垃圾回收器,从长期目标来看是为了取代CMS回收器,G1回收器拥有独特的垃圾回收策略。G1属于分代垃圾回收器,区分新生代和老年代,依然有eden和from/to区,它并不要求整个eden区或者新生代、老年代的空间都连续,它使用了分区算法。

  • 并行性:G1回收期间可多线程同时工作。

  • 并发性:G1拥有与应用程序交替执行能力,部分工作可与应用程序同时执行,在账号呢刚刚GC期间不会完全阻塞应用程序。

  • 分代GC:G1依然是一个分代的收集器,但是它是兼顾新生代和老年代一起工作,之前的垃圾收集器他们或者在新生代工作,或者在老年代工作,因此这是一个很大的不同。

  • 空间整理:G1在回收过程中,不会像CMS那样在若干次GC后需要进行碎片整理,G1采用了有效复制对象的方式,减少空间碎片。

  • 可预见性:由于分区的原因,G1可以只选取部分区域进行回收,缩小了回收的范围,提升了性能。

  • 使用 -XX:+USEG1GC 应用G1收集器

  • 使用 -XX:MaxGCPauseMillis 指定最大停顿时间

  • 使用 -XX:ParalleGCThreads 设置并行回收的线程数量

附:垃圾回收思维导图

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值