JVM,关于JVM基础的知识,你确定不了解一下吗?

这篇具有很好参考价值的文章主要介绍了JVM,关于JVM基础的知识,你确定不了解一下吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.JVM的概念

什么是JVM?

二.JVM的运行流程

1.class文件如何被JVM加载并运行

2.JVM运行时数据包括哪些区域(M)

三.类加载的过程(M)

四.双亲委派模型

1.双亲委派模型分析

2.JAVA中有哪些类加载器(M)

五.垃圾回收机制

1.死亡对象的标识

①引用计数算法

②可达性分析算法

 什么是GC Roots 呢?

GC Roots一般有以下几种类型:

2.垃圾回收的算法

①标记清除算法

②标记复制算法

③标记整理算法

 垃圾回收的过程?(M)

1.Minor GC(新生代的垃圾回收)

 2.Full GC(老年代的垃圾回收)

3.垃圾回收器

介绍一下垃圾回收器(M)

 主要的垃圾回收器有以下几种:


一.JVM的概念

什么是JVM?

JVM,关于JVM基础的知识,你确定不了解一下吗?
JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 

二.JVM的运行流程

1.class文件如何被JVM加载并运行

JVM,关于JVM基础的知识,你确定不了解一下吗?

①当.java文件被编译为.class文件时,.class文件会被加载到类加载子系统,然后由类加载子系统将文件加载到运行时数据区

②在运行时数据区中,类对象被加载到方法区中,便于后面new出来的实例对象可以通过这个类对象模板中创建新的对象。

③创建出来实例对象会被加载到堆中

④虚拟机栈:每个线程都会在虚拟机栈中开辟一个空间,每调用一个方法时,这个方法就会被压入栈中,也就是说每个栈中存放的是方法调用的层级

⑤本地方法栈:同样是每一个线程都会在本地方法栈中开辟一块内存,每次调用一个本地方法,这个本地方法就会被加载到本地方法栈中。

⑥程序计数器:记录当前线程所运行到的指令地址:由于考虑到java虚拟机在多线程模式下是通过线程轮流切换并分配时间片的方式进行的,因此当某个线程分配的时间片使用完但是当前线程并没有执行结束时,这时就需要使用程序计数器记录下当前线程所运行到的指令地址,当当前线程再度被分配到时间片时,从当前指令下继续执行。

2.JVM运行时数据包括哪些区域(M)

①方法区:在JDK1.7之前, 方法区又被称作永久代,在1.8及之后被称为元空间,区别在于实现方式的不同,方法区是当类对象被加载到JVM时存储的地方,类对象被存储到方法区中以便后续需要创建实例对象时直接从方法区中的类对象获取并创建实例对象。需要说明的是,方法区是所有线程所共享的

②堆:创建的实例对象都会被加载到堆空间中,堆空间的大小可以通过JVM中的参数进行设置:Xms10(最小堆内存空间) 是设置堆空间大小,Xmx10(最大堆内存空间)也是设置堆空间大小的:通常我们将这两个内存参数设置为同一个大小,我们一般将两个参数均设置为线程运行可能消耗的最大堆空间,如果内存空间比较小时,可能会出现OOM错误(OUT OF MEMORY ERROR),一旦出现这个错误,我们可以将堆空间设置的大一点。

③java虚拟机栈:每个线程都会在虚拟机栈中开辟一个空间,每调用一个方法时,这个方法就会被压入栈中,也就是说每个栈中存放的是方法调用的层级,虚拟机栈容量的大小一般由Xss这个参数确定,如果栈溢出,会报出StackOverFlow错误

④本地方法栈:同样是每一个线程都会在本地方法栈中开辟一块内存,每次调用一个本地方法,这个本地方法就会被加载到本地方法栈中。

⑤程序计数器:记录当前线程所运行到的指令地址:由于考虑到java虚拟机在多线程模式下是通过线程轮流切换并分配时间片的方式进行的,因此当某个线程分配的时间片使用完但是当前线程并没有执行结束时,这时就需要使用程序计数器记录下当前线程所运行到的指令地址,当当前线程再度被分配到时间片时,从当前指令下继续执行。

三.类加载的过程(M)

JVM,关于JVM基础的知识,你确定不了解一下吗?

1.加载

将所有的.class文件全部加载到虚拟机中

2.验证

根据.class文件的规范对当前的文件进行验证

JVM,关于JVM基础的知识,你确定不了解一下吗?

3.准备

将各种类型的值初始化为默认的值,int 初始化为0,float初始化为0.0f.......

4.解析

将java虚拟机中常量池的符号引用替换为直接引用,也就是初始化常量池的过程。(例如:原本常量池中的字符串并没有直接引用,(还是占位符),在这个过程中将创建一个新的字符串并将常量池中的占位符进行替换)

JVM,关于JVM基础的知识,你确定不了解一下吗?

 

5. 初始化

之前的工作都是准备工作,这一步是真正执行类中的java代码,经过这一步,真正的java对象才会被创建出来

四.双亲委派模型

1.双亲委派模型分析

不同的类在加载时会使用不同的类加载器:

JVM,关于JVM基础的知识,你确定不了解一下吗?

 其类加载器的策略如下:当创建一个类时,先从applicationClassLoader开始向上转发,一直到BootStrapClassLoader,BootStrapClassLoader在自己的加载路径中查找是否存在这个类,有则加载,没有则向下转发到ExtClassLoader,ExtClassLoader在自己的加载路径中查找有没有这个类,有则加载,没有则向下转发到ApplicationClassLoader,在自己的路径中查找并加载这个类

2.JAVA中有哪些类加载器(M)

JVM,关于JVM基础的知识,你确定不了解一下吗?

五.垃圾回收机制

1.死亡对象的标识

①引用计数算法

概念:当对象被引用,那么其引用的次数就加1,当引用的对象为0的时候,就将这个对象标识为死亡对象,这个对象就该被回收了。

图示如下:

JVM,关于JVM基础的知识,你确定不了解一下吗?

 过程分析:当创建两个对象,定义两个变量指向创建的两个对象,此时这两个对象的引用都+1,同时使用对象的instance属性也指向这两个创建的对象,这时这两个新创建的对象的引用次数都是2了,但是如果对这两个变量置为空,则两个新创建的对象的引用次数-1,但是由于两个变量都为空了,两个变量的instance属性也无法访问到这两个对象了,但是由于这两个对象的引用次数并没有变为0(instance属性仍然指向两个对象),因此这两个对象无法进行回收,这也就造成了内存泄漏的问题

notes:内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏问题在程序刚开始运行时并不容易发现,当程序运行了一段时间,堆空间不断放入新的对象而无法及时清除,最终会导致堆空间被占满,导致程序崩溃。

②可达性分析算法

可达性分析算法的实现原理如下:从GC Roots(起始结点集)根据引用关系从上往下搜寻,搜寻的路径称为【引用链】,如果某个结果到任何一个根对象都没有引用链,则称这个对象不可达,标识这个对象不可达。

JVM,关于JVM基础的知识,你确定不了解一下吗?


在垃圾回收时首先会搜寻到所有的根结点【枚举根结点】,然后从这些根结点从上向下搜寻,这个过程需要暂停用户线程,即触发STW,能搜寻到说明这个对象保留,如果不能搜寻这个对象则使用垃圾回收的算法对其进行回收。

 什么是GC Roots 呢?

GC Roots也是对象,而且是JVM一定不能回收的对象,在JVM进行GC的时候,在所有用户到达safepoint之后首先会进行STW,暂停所有用户的线程,之后进行对根结点的枚举,之后再从根结点从上往下搜寻。

GC Roots一般有以下几种类型:

1、方法区静态属性引用的对象
全局对象的一种,Class对象本身很难被回收,回收的条件非常苛刻,只要Class对象不被回收,静态成员就不能被回收。

2、方法区常量池引用的对象
也属于全局对象,例如字符串常量池,常量本身初始化后不会再改变,因此作为GC Roots也是合理的。

3、方法栈中栈帧本地变量表引用的对象
属于执行上下文中的对象,线程在执行方法时,会将方法打包成一个栈帧入栈执行,方法里用到的局部变量会存放到栈帧的本地变量表中。只要方法还在运行,还没出栈,就意味这本地变量表的对象还会被访问,GC就不应该回收,所以这一类对象也可作为GC Roots。

4、JNI本地方法栈中引用的对象
和上一条本质相同,无非是一个是Java方法栈中的变量引用,一个是native方法(C、C++)方法栈中的变量引用。

5、被同步锁持有的对象
被synchronized锁住的对象也是绝对不能回收的,当前有线程持有对象锁呢,GC如果回收了对象,锁就失效了。

2.垃圾回收的算法

①标记清除算法

算法思路:标记当前所有对象中的不可用对象,在原位将其进行标注,之后进行清除

缺陷:但是这个算法的缺陷也比较明显:在原位将不可用对象进行了清除,会产生大量不连续的可用空间碎片,如果在这时需要创建较大的对象但是当前连续的可用空间不满足时,则需要触发下一次垃圾回收。

JVM,关于JVM基础的知识,你确定不了解一下吗?

 JVM,关于JVM基础的知识,你确定不了解一下吗?

②标记复制算法

算法思路:将全部的可用空间划分为两部分,比如划分为空间1和空间2,空间1在清除完不可用对象后,存在大量的不连续的可用空间的碎片,空间2对空间1中的可用和不可用对象进行分类整理排列,在排序完成后将空间1进行整体清除,后面再次清除时重复这种操作

缺陷:这种算法的缺陷也相对明显,再每一次垃圾回收的过程中,只有一半的空间能真正发挥作用

JVM,关于JVM基础的知识,你确定不了解一下吗?

③标记整理算法

算法思路如下:在每次清除完部分的不可用对象之后就对全部的对象进行排序整理

缺陷:每次清除都要进行排序整理,算法效率相对较低

JVM,关于JVM基础的知识,你确定不了解一下吗?

 垃圾回收的过程?(M)

JVM,关于JVM基础的知识,你确定不了解一下吗?

 不同的类对象进行了分代处理,将所有的类对象分为了新生代和老年代,其中新生代占堆空间的1/3,老年代占堆空间的2/3,新生代的空间中还有1/5的survivor(幸存者分为from和to两个区域)区域。对象进行了分代处理,垃圾回收也被划分为两种类型:①Minor GC(新生代的垃圾回收)②Full GC(Major GC/Full GC 发生在老年代的垃圾回收)。

1.Minor GC(新生代的垃圾回收)

新生代的垃圾回收采用的是复制算法(因为新生代中的对象迭代比较频繁,所以需要效率相对较高的算法,虽然复制算法所消耗的空间较大,但是其效率相对较高),其过程如下:


①创建对象时在Eden区直接创建,此时survivor两块区域都为空(空间大小之比:Eden:from:to=8:1:1)

JVM,关于JVM基础的知识,你确定不了解一下吗?

②当我们再次创建对象,发现Eden区当前的容量不足以存放当前对象,则将Eden区的对象进行判断处理,对判定死亡的对象进行清除,存活的对象将其移至survivor区中的from区,移动到from区的对象的“年龄”+1;

JVM,关于JVM基础的知识,你确定不了解一下吗?

③Eden区持续创建新的对象,并对没有引用的对象进行清除之后,Eden区存活的对象都被移动到了from区,Eden区和from区都被占用满了,这时要把Eden区和from区存活的对象移动到to区,然后将Eden区和from区都进行清空,在上一轮中被放置在from区的对象的年龄再加1

JVM,关于JVM基础的知识,你确定不了解一下吗?

⑤在下一轮GC中会将from区和to区的位置互换,此时to区为空,from区和Eden区继续参与下一轮的GC ,重复上面的步骤

JVM,关于JVM基础的知识,你确定不了解一下吗?

⑥经过不断的GC,在新生代中的对象的年龄达到了一定的阈值(默认阈值是15),这时候就要将这些对象移动到老年代

JVM,关于JVM基础的知识,你确定不了解一下吗?

 总结:我们纵观整个新生代垃圾处理的过程来看:在每一轮的GC中,新的对象会在Eden区创建,当Eden区剩余的容量不足以创建新的对象时,将所有的Eden区存活的对象移动到from区,在下一轮GC时会将from和Eden区存活的对象全部复制到to区,将from区和Eden区全部清空,将to区和from进行调换继续进行垃圾回收。

 2.Full GC(老年代的垃圾回收)

老年代的垃圾回收策略并不是采用复制算法,而是标记整理算法, 因为进入老年代的对象相对于新生代而言并不会进行频繁的创建和销毁,所以使用标记整理算法比较适合。Full GC相对于Minor GC要慢很多,所以在JVM调优过程中,很大的一部分工作都是对Full GC的调节

3.垃圾回收器

介绍一下垃圾回收器(M)

在讲述垃圾回收器之前,我们先说一下垃圾回收器的发展过程:由于在垃圾回收的过程中要执行STW,所有的用户线程在这个过程中都要暂停线程服务,所以缩短STW的时间是垃圾回收器在完成业务需求之后所要追求的目标.。在刚开始时使用单线程垃圾回收器,随着程序规模的不断扩大和程序内容的不断丰富,单线程垃圾回收器无法满足用户需求,多线程垃圾回收器应运而生,随着程序的不断发展,多线程STW的时间也越来越长,又开始尝试新的垃圾回收器来缩短STW的时间

JVM,关于JVM基础的知识,你确定不了解一下吗?文章来源地址https://www.toymoban.com/news/detail-432107.html

 主要的垃圾回收器有以下几种:

  • Serial收集器(复制算法)
    新生代单线程收集器,标记和清理都是单线程,优点是简单高效。是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。
  • Serial Old收集器(标记-整理算法)
    老年代单线程收集器,Serial收集器的老年代版本。
  • ParNew收集器(停止-复制算法) 
    新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。
  • Parallel Scavenge收集器(停止-复制算法)
    并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
  • Parallel Old收集器(停止-复制算法)
    Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。
  • CMS(Concurrent Mark Sweep)收集器(标记-清理算法)
    高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择。

到了这里,关于JVM,关于JVM基础的知识,你确定不了解一下吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 门店系统了解一下:如何选择适合概念店的POS?

    概念店是指一种专注于提供独特产品或服务的零售店,具有创新性和个性化的特点。这样的门店需要一个可以支持其特殊需求的POS系统。 在选择概念店最合适的POS系统之前,我们需要先了解POS系统在门店系统中扮演的角色。 POS系统是门店系统的核心,它不仅可以记录客户信

    2024年02月08日
    浏览(25)
  • 模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)

    模板匹配指的是通过模板图像与测试图像之间的比较,找到测试图像上与模板图像相似的部分,这是通过计算模板图像与测试图像中目标的相似度来实现的,可以快速地在测试图像中定位出预定义的目标 是图像处理中最基本、最常用的匹配方法 为感兴趣的对象 创建模型 :使

    2024年02月08日
    浏览(32)
  • JVM 虚拟机 ---> JVM 基础概念

    一、Java 跨平台 Java是一种 可跨平台 的编程语言,我们通常把 CPU 处理器与操作系统构成的计算机系统整体成为叫 平台 不同的 CPU ,差异主要在底层指令集不同,指令集分为精简指令集( RISC )和复杂指令集( CISC )。每个 CPU 都有自己的特定指令集 **指令集:**是CPU中用来计

    2024年02月09日
    浏览(31)
  • 学一点关于JVM类加载的知识

    要研究类加载过程,我们先要知道关于 Java 处理代码的流程是怎么样的。 第一步:编写源代码 这一步是我们最熟悉的,就是我们在 idea 上写的业务代码,生成 Example.java 文件。 第二步:编译源代码 我们通过 java 编译器(如‘javac’)将我们编写的源代码编译成 字节码 。 w

    2024年01月23日
    浏览(33)
  • JVM基础了解

            JVM 是java虚拟机。        作用: 运行并管理java源码文件锁生成的Class文件;在不同的操作系统上安装不同的JVM,从而实现了跨平台的保证。一般在安装完JDK或者JRE之后,其中就已经内置了JVM,只需要将Class文件交给JVM即可  写好的java源文件,会编译生成16进制的字

    2024年02月12日
    浏览(30)
  • 【数据结构】-关于树的概念和性质你了解多少??

    作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 今天我们来讲一讲非线性的一种数据结构,大家肯定对这种结构充满好奇和不解,今天我就带大家来解决这个问题,我所将的是树以及

    2024年02月02日
    浏览(31)
  • 关于Redis,你需要学习了解的知识

    关于 Redis ,涵盖多个方面,从基础概念到高级应用,以及最佳实践等。比如以下内容: 认识 Redis: Redis 是什么?它的特点和优势是什么? Redis 的数据结构:字符串、哈希、列表、集合、有序集合、位图等。 安装和配置 Redis: 在不同操作系统上安装 Redis。 配置 Redis 的基本

    2024年02月13日
    浏览(34)
  • TCP基础概念了解

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它完成第四层传输层所指定的功能。 TCP 协议的特点是: 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的。 可靠交付

    2024年02月04日
    浏览(33)
  • 初识网络 --- 浅了解一些基础概念

    在每台计算机独立的情况下:假设现在有三台计算机,每台计算机各持有一个业务。那么现在有个程序员处理业务时,如果想要处理业务1就要操作计算机1,处理业务2就要操作计算机2,这样的效率明显不高 那么如果能将三台计算机都连接到一台服务器中,那么三台计算机就

    2024年02月11日
    浏览(28)
  • 今天来认识一下无聊的spark和scala基础理知识

    spark: 首先了解什么是spark。 Spark是一种快速、通用、可扩展的大数据分析引擎。 --spark的发展史 spark的主要优点 1.快速 一般情况下,对于迭代次数较多的应用程序,Spark程序在内存中的运行速度是Hadoop MapReduce运行速度的100多倍,在磁盘上的运行速度是Hadoop MapReduce运行速度的

    2024年03月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包