关于JVM:内容以及流程释义

news2024/12/23 18:05:40

对于JVM、GC、类加载,很多人摸不清楚头绪,不知道他们之间的关系。误以为GC和类加载还有JVM区分统称垃圾回收,实则他们包含的东西很多,很细,完整的了解正个JVM的加载过程,就需要全面理解这些东西。

我认为的理解相互关联步骤:

类的加载过程

通过类的加载延伸到gc的编译原理

根据gc得到解决方案并拓展锁知识

根据这些完全熟悉gc的生态链

下面开始开始简述相关知识。

1.内存区域类型

*.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;

*. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);

*. 堆:存放所有new出来的对象;

*. 静态域:存放静态成员(static定义的);

*. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;

*. 非RAM存储:硬盘等永久存储空间

2.堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表

3.堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

4、数据结构中的堆和栈

堆和栈在数据结构中是两种不同的数据结构。 两者都是数据项按序排列的数据结构。

栈:像是装数据的桶或者箱子

栈是大家比较熟悉的一种数据结构,它是一种具有后进先出的数据结构,也就是说后存放的先取,先存放的后取,这就类似于我们要在取放在箱子底部的东西(放进去比较早的物体),我们首先要移开压在它上面的物体(放入比较晚的物体)。

堆:像是一颗倒立的大树

堆是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指二叉树。堆的特点是根节点的值最小(或最大),且根节点的两个树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

一.类加载

1.类加载的过程

在这里插入图片描述

(1)将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。

(2)分为三个阶段:

        1)验证阶段:验证文件的安全性,防止对jvm本身造成危害;

        2)准备阶段:正式为类变量(static变量)分配内存并设置类变量初始值

        3)解析阶段:虚拟机常量池的符号引用替换为字节引用过程

(3)执行类构造器初始化类对象;

总结:初始化-加载-销毁

2.由类加载过程延伸的问题

(1)类加载器?

   虚拟机提供了3种类加载器:

         启动类加载器:主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分;

         扩展类加载器:负责加载JAVAHOME路径下的jdk中的一些类库;

         系统类加载器:负责加载CLASSPATH路径下的应用程序。

(2)jvm以什么样的方式加载一个类

   采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式即把请求交由父类处理,它一种任务委派模式。 那么,一起来理解下双亲委派模式:

image.png

双亲委派:如图,根据自定义类加载器-再到系统类-然后拓展类-最后引导类加载器。如果你在最下层系统类加载器中,编写了一个StringUtil,但是在引导类加载器也有一个相同类,默认只加载系统存在的StringUtil,主要原因是防止修改核心类,保证安全性, 双亲委派模式的好处是避免了一个类会被重复加载。

3.jvm什么时候决定加载一个类?

   1)创建对象就会触发加载;

   2)引用了该类的静态属性、方法都会触发类的加载;

   3)初始化子类也会导致父类被加载;

4.java中创建对象的几种方式?

   1) new对象

   2) 用反射创建对象(代理)

   3) 克隆对象

   4) 序列化

二.JVM

JVM定义:指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。

线程私有区域:程序计数器、Java虚拟机栈、本地方法栈(与线程生命周期一致)

线程共享区域:Java堆、方法区、运行时常量池

jvm主要知道它各个模块与作用即可。(小型独立运行的虚拟机)

三.GC

1.GC本质上就是对JVM内存管理的一个名词(垃圾回收)。

栈:和唯一的一个线程强绑定,线程出现就需要这块内存,线程结束,这块内存就可以回收了,这块内存的分配/回收时机是明确的,就不需要 GC 来操心。

常量池+方法区:首先,这两块内存占比较小,其次,里面的数据很少“失去作用”。回收这块内存性价比不高,也不是重点考虑的。

堆:GC 的重点就是如何管理堆上的内存。堆上的内存是以对象为单位进行管理的,分配与回收的都是一个完整的对象。因此,回收转换成了回收死对象的问题。

2.如何判断对象已死

死对象:没有引用指向的对象。

1)引用计数法ReferenceCount:无法解决对象的循环引用问题

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。 引用计数法实现简单,判定效率也比较高。
2)可达性分析算法

核心思想: 通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到GC Roots没有任何的引用链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可用的。

GC Roots的对象包含下面几种:

   虚拟机栈(栈祯中的本地变量表)中引用的对象

方法区中的静态属性不回收,所以有引用指向的对象必须活着,常量引用的对象

常量池中引用指向的对象

如果在GC过程中,可达性分析后对象的引用关系发生了变化,有可能造成对象回收错误,所以通常在GC中,会通知应用线程的执行(STW:Stop The World)

3.引用分类

1)强引用:被引用的对象必需活着

2)弱引用:gc就回收

3)虚引用:和引用无关,但是回收会通知

4)软引用:被引用的对象尽可能活着,但是内存紧张可以回收

4.垃圾回收算法

1)标记清除:标出所有需要回收的对象回收。

2)复制算法(新生代回收算法):把空间分2区域,把使用的对象复制到新区域,便于区分回收。缺点:需要翻倍内存。

3)标记整理(老年代回收算法):第一阶段标记被引用对象,第二阶段遍历堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。(清除和复制的结合)

4)分代收集算法:根据对象存活周期分块,分为新生代和老年代。新生代采用复制,老年代采用标记整理

对象在Eden区分配

大多数情况下,对象在新生代中 Eden 区分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次Minor GC。

看看 Minor GC和Full GC 有什么不同呢?

Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。

Major GC/Full GC:一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上。

Eden与Survivor区默认8:1:1 大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活 的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回 收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所 以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三节锂电池充电管理芯片,IC电路图,BOM物料表

5V输入升压,三节锂电池充电管理芯片,IC电路图和BOM物料表;20V输入降压,三节锂电池充电管理芯片,IC电路图和BOM物料表。 5V输入,三节锂电充电管理系统 1 5V输入升压,三节锂电池充电管理芯片 FS40…

实现网站都变成灰色-filter

如下:当某些情况发生时一些娱乐网站统一变成灰色系,全站的内容都变成灰色了,包括按钮、图片等等。 怎么实现的? 最简单的是考虑所有的内容都统一换了一个 CSS 样式,图片也全换成灰色的,按钮等样式也统一换…

Web3和区块链入门——Web3历史和Web3是什么?

大家好,我是无用,今天跟大家聊下Web3历史和Web3什么。 Web3历史 Web3.0一词最初由英国计算机科学家蒂姆伯纳斯-李(著名的万维网之父)在1998年提出,但是他那个时候所说的Web3.0是自己所提出的语义网络,他认为…

Newsletter 2022-11|HStreamDB 0.11 发布

11月我们发布了 HStreamDB 0.11,修复了多项已知问题。同时也在继续推进 HStream Platform 的开发,并计划于本月底上线首个 Alpha 版本。 v0.11 发布 随着云原生流数据库 HStreamDB 项目的日益成熟,为了更好地适应项目发展,我们决…

零基础入门推荐系统 - 新闻推荐 - 实操1

内容导航: 零基础入门推荐系统 - 新闻推荐 - 实操1赛题数据介绍:数据集介绍:读取数据集:零基础入门推荐系统 - 新闻推荐 - 实操1 赛题数据介绍: 赛题以预测用户未来点击新闻文章为任务,数据集报名后可见并可下载,该数据来自某新闻APP平台的用户交互数据…

torch.autograd

torch.autograd torch.autograd: 提供了类和函数,用来对任意的标量函数进行求导,要想使用自动 求导,只需要对已有的代码进行微小的改变,只需要将所有的tensor包含进VariableVariableVariable对象中即可。 torch.autograd.backwa…

2.2.2同向放大器、同向放大器的设计

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

unity——通过点击按钮进行场景切换

前记 通过点击鼠标进行场景切换请参考: Unity——通过点击鼠标进行场景切换_行秋的博客-CSDN博客通过点击按钮进行场景切换请参考:unity——通过点击按钮进行场景切换_行秋的博客-CSDN博客1.准备两个示例场景 2.点击File—>Build Settings...&#…

网页优化(布局优化、图片优化)

为什么页面优化? 页面扩展灵活提高页面的加载速度提高用户的体验 布局优化-高度自适应 自适应 1.宽高不写 注意:当子元素浮动时,父元素不写高度会引起高度塌陷 2.宽高写%单位 3.使用max-width/min-width/max-height/min-height 高度塌陷 清除高度塌…

Java基础语法纯小白入门

第二天内容: |___01.今日内容概述.mp4 |___02.数据类型转换_自动类型转换.mp4 |___03.数据类型转换_强制类型转换.mp4 |___04.数据类型转换注意事项.mp4 |___05.数据类型转换面试题.mp4 |___06.编码表简单概述.mp4 |___07.Java运算符_算术运算符.mp4 |___08…

【kafka】Timed out waiting for a node assignment

1.概述 在做flink任务的时候,报错 Timed out waiting for a node assignment 详细错误如下 2.源码 在SourceCoordinator中我们调用了start方法启动.启动方法主要做了2件事 创建Enumerator启动Enumerator

Machine Learning机器学习(学习记录)

Machine Learning机器学习 目录Machine Learning机器学习聚类K-Means基本思路k均值算法流程k均值算法的特点k-均值算法的优点:k-均值算法的缺点:sklearn实现KMeansK-Means算法基本思路代码实现K-MeansPython代码实现sklearn实现K-Means参考:聚…

[附源码]Python计算机毕业设计Django小太阳幼儿园学生管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

基于Intel Lake-UP3平台的超声设备方案设计,提供出色的图形和AI性能

超声系统要求 有效的超声系统可加快诊断速度,并帮助医生更快做出更有效的治疗决策。 为此,超声机器要求极高的处理性能和图形渲染效果以提高诊断准确性,并立即获取精确的图像。 类似地,还需要易于移动以适应不断变化的医疗场景和…

p1.第一章 基础入门 -- Python开发环境安装 (一)

1.基础入门 1.1 环境安装 1.1.1 windows环境安装 Python下载地址:https://www.python.org/downloads/ 1.1.1.1 python多版本安装 下载并安装3.6.8 下载Windows x86-64 executable installer,python 3.6.8下载地址:https://www.python.o…

章鱼网络社区治理的4种方式

全长1810字,预计阅读 8 分钟 作者:MiX 2021年10月8日章鱼网络主网启动的时候,创始人 Louis 曾代表核心团队承诺:用3年的时间让章鱼网络转化成一个完全由社区所有,并由社区管理的去中心化协议。 我们认为3年的过渡期是…

【Java】之Java8新特性

Java 基础系列的笔记终于完成了🎉🎉🎉 目录 一、Lambda 表达式 1. Lamdba 表达式概述 2. 使用 Lambda 表达式前后对比 3. 怎样使用Lambda表达式 4. Lamdba表达式总结 二、函数式接口 1. 函数式接口概述 3. Java内置函数式接口 4. 使…

我是怎么从软件测试转到自动化测试岗的?亲身经历分享

相信很多人接触软件测试岗位,都纯功能界面的测试,我也不例外。那个时候是在一广州一家电商公司做测试,做了也有一段时间,熟悉了产品业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松&#xf…

电子电气架构设计需要考虑哪些方面?

当前车辆日益复杂,车联网功能在各个细分领域都在不断增加,而更强大的智能功能也逐步增加。 所有这些高级功能都依赖于线束和控制器才能发挥作用。然而面对日益增加的车辆复杂性和产品开发周期缩短的压力,导致汽车制造商和系统集成商的成本和…

VMware Workstation 12 安装windows_server_2016

步骤: (1)去微软官网去下载windows_server_2016 iso镜像文件,链接:https://www.microsoft.com/zh-cn/evalcenter/download-windows-server-2016 (2)创建新的虚拟机 (3)…