JVM重点整理

一、虚拟机架构图

在这里插入图片描述

二、类加载过程

在这里插入图片描述
类加载器的作用:负责把class文件加载到内存中

类加载过程:

  • 加载:
    • 通过类的全限定名获取此类的二进制字节流
    • 文件的编码结构---->运行时的内存结构
    • 内存中生成一个class对象
  • 链接:
    • 验证:保证被加载类的一个正确性
    • 准备:为类变量分配内存 设置类变量初始值(不会为final修饰的变量以及实例变量赋值)
    • 解析:相当于一个翻译过程
  • 初始化: 初始化阶段执行类加载方法() 的过程,()不同于类的构造器。若该类具有父类,JVM 会保证子类的()执行前,父类的该方法已经执行完。多线程下被同步加锁。

三、类加器的分类

在这里插入图片描述

  • 虚拟机自带的类加载器:
    • 启动类加载器:由c/c++语言实现,嵌套在JVM内部,不继承自java.lang.ClassLoader,没有父加载器,只加载java、javax、sun等开头的类
    • 扩展类加载器:派生于ClassLoader类,父类加载器为启动类加载器。
    • 应用类加载器:默认的类加载器,一般来说,java应用的类都是由它完成加载。派生于ClassLoader类,父类加载器为扩展类加载器。通过ClassLoader.getSystemClassLoader()方法获取该类加载器。
    • 自定义类加载器:
      • 好处:隔离加载类
      • 修改类加载的方式
      • 扩展加载源
      • 防止源码泄露

双亲委派机制:
在这里插入图片描述
在这里插入图片描述
好处: 避免类的重复加载、保护程序安全,防止核心API被篡改。
沙箱安全机制: 保护原生JDK的安全。

四、内部结构

1、PC 寄存器: 用来存储下一条即将执行的指令地址,指令由执行引擎执行。
使用PC寄存器存储字节码指令地址有什么用?/ 或为什么使用PC寄存器记录当前线程的执行地址?
因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

2、本地方法:(native修饰的)与java环境外交互、与操作系统交互。本地方法栈:用来管理本地方法的结构 线程私有
3、虚拟机栈:
概念:栈是运行时的单位、栈解决程序运行时的问题,即程序如何执行,或者如何处理数据。
栈帧:一个内存区块,栈中数据以栈帧格式存在,每个方法对应一个栈帧。
在这里插入图片描述
局部变量表:存储方法参数和定义在方法体内的局部变量,数组结构,建立在线程的栈上,线程私有不存在数据安全问题。容量大小在编译期就已确定,随栈帧的销毁而销毁。
运行原理:先进后出
4、堆空间
概述:

  • 一个JVM实例对应一个进程实例,一个JVM实例有一个运行时数据区。
  • 一个Runtime就有一个独立的方法区和堆
  • 一个进程有多个线程,多个线程共享一个方法区和堆空间
  • 一个线程拥有自己独立的程序计数器、本地方法栈、虚拟机栈
  • 为了解决多个线程访问出现线程不安全问题—>TLAB(线程私有空间)
  • 垃圾回收只会在堆(方法区)当中进行回收

堆内存细分:
基本划分:新生代+老年代+元空间
比例:新生代:老年代=1:2
新生代=Eden:from:to=8:1:1
创建对象在Eden区

内存分配策略

  • 默认对象分配在Eden区
  • 如果一个对象回收超过阈值次数还存活就把它放入老年代
  • 大对象分配在老年代
  • 对于体积不大的对象优先分配在Eden区的TLAB区
  • 对象还有可能分配在栈空间

TLAB区(Thread Local Allocation Buffer)

为什么要有该区域?
	堆空间是线程共享的区域,在高并发的场景下分配内存空间,会出现线程不安全的问题,采用加锁虽然可以避免此问题但是会影响效率。
	TLAB是线程私有的一块区域,即使多个线程同时分配也不会有线程安全的问题,提高吞吐量,快速分配,JVM会将TLAB作为内存分配的首选

五、逃逸分析
1、为什么存在逃逸分析
如果对象在堆内存分配–可能引起GC–导致STW–应用程序卡顿,而逃逸分析可以减少此类现象的发生
2、什么情况在栈上分配
如果一个对象没有发生逃逸,就可以在栈上分配,随着方法的结束对象的出栈,不涉及GC有效提高性能
3、判断对象是否发生逃逸
new出来的对象是否被外部方法调用,调用了就代表逃逸了。新建对象尽量是局部变量
4、逃逸分析目前还不是很成熟
六、方法区(元空间)
线程共享的区域,此区域大小决定了系统可以加载多少个类
堆栈方法区三者的关系:
在这里插入图片描述
内部结构:

  • 类的信息:类、接口、枚举等
  • 域信息:包的public、protected、private等
  • 方法信息:方法名称、返回类型
  • 常量信息
  • 静态变量/类变量

方法区的垃圾回收:
必要又难以让人满意,主要回收常量池里面不常使用常量和类型

七、垃圾回收

垃圾:在程序运行过程中没有任何指针指向该对象
意义: 不进行垃圾回收内存迟早会消耗完,导致其他对象无法分配内存,没有GC则无法保证应用程序的正常进行。
回收区域: 只有方法区和堆、频繁收集新生代、较少收集老年代、基本不动元空间/方法区

八、垃圾回收算法

判断对象是否存活的两种算法:引用计数法和可达性分析算法
1、引用计数算法
对于一个对象被引用则加1,引用失效就减1,当计数器为0时则表示该对象为垃圾。
缺点:无法解决循环依赖的问题
在这里插入图片描述
2、可达性分析算法:
以根对象为起始点从上往下搜索根对象所链接的对象是否可达,搜索走过的路径被称为引用链,不可达对象称为垃圾,
判定一个对象是否可回收,至少要经历两次标记过程。
在这里插入图片描述
GC Roots包含元素

  • 方法区中常量引用对象
  • 同步sync关键字持有的对象
  • 静态类变量

3、标记清除算法
在这里插入图片描述

标记: 从引用根节点开始遍历,标记所有被引用的对象。一般是对象的header中记录为可达对象
清除: 从头到尾进行遍历,如果某个对象在其header中没有标记为可达对象,则将其回收,清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表,下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够就存放。
缺点: 产生空间碎片,还需要维护一个空闲列表
4、标记压缩算法(老年代)

在这里插入图片描述
缺点:移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址,移动过程中,需要全程暂停用户应用程序即STW。
5、复制算法(新生代)
核心思想:将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。

在Eden区空间用完并且程序需要再创建对象时触发Minor GC 在GC后,如果对象仍然存活,将会被移到Survior区。
在这里插入图片描述
再次触发GC的时候Eden区和from区两者会作为回收区域
在Eden和from回收存活的对象复制到to之后要做三件事情
1、清空Eden和from区
2、把原先from变为to原先to变为from
3、对象d年龄加1(年龄达到设定值—>老年代)
在这里插入图片描述
优点:没有标记和清除过程,高效、不会产生空间碎片
缺点:需要两倍活着对象的空间大小
6、分代回收算法
新生代和老年代回收算法
7、增量回收算法
垃圾收集线程每次只收集一部分空间,接着切换到应用程序,反复执行,可避免长时间STW
缺点:线程来回切换造成上下文开销,降低吞吐量
8、分区回收算法
把一个内存区域划分为多个内存空间,每次只回收若干小区域内存
9、总结
没有最好的回收算法,只有最合适的,目前用的最多的是复合算法

九、MinorGC/MajorGC/FullGC的对比

a.MinorGC
只回收新生代
新生代空间不足的时候,该区域有个特点 对象大部分是朝生夕死
会触发STW 暂停其他用户线程 垃圾收集结束 用户线程才恢复
b.MajorGC
回收老年代
回收速度比MinorGC慢10倍以上 STW时间更长
c.FullGC
回收整个堆与方法区
更应该尽量避免

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络】socket——预备知识 | 套接字 | UDP网络通信

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 在前面本喵对网络的整体轮廓做了一个大概的介绍,比如分层,协议等等内容&#x…

【QT】元对象系统学习笔记(一)

QT元对象系统 01、元对象系统1.1、 元对象运行原则1.2、 Q_OBJECT宏1.3、 Qt Creator启动元对象系统1.4、 命令行启动元对象(不常用) 02、反射机制2.1、 Qt实现反射机制2.2、 反射机制获取类中成员函数的信息2.1.1、 QMetaMethon类2.1.2、QMetaObject类 …

【UE4 塔防游戏系列】07-子弹对敌人造成伤害

目录 效果 步骤 一、让子弹拥有不同伤害 二、敌人拥有不同血量 三、修改“BP_TowerBase”逻辑 四、发射的子弹对敌人造成伤害 效果 步骤 一、让子弹拥有不同伤害 为了让每一种子弹拥有不同的伤害值,打开“TotalBulletsCategory”(所有子弹的父类…

架构训练营:3-3设计备选方案与架构细化

3架构中期 什么是备选架构? 备选架构定义了系统可行的架构模式和技术选型 备选方案筛选过程 头脑风暴 :对可选技术进行排列组合,得到可能的方案 红线筛选:根据系统明确的约束和限定,一票否决某些方案(主要…

为 GitHub 设置 SSH 密钥

1. 起因 给自己的 github 改个名,顺便就给原来 Hexo 对应的仓库也改了个名。然后发现 ubhexo clean && hexo generate && hexo deploy 失败了,报错如下: INFO Deploying: git INFO Clearing .deploy_git folder... INFO …

Hive自定义函数

本文章主要分享单行函数UDF(一进一出) 现在前面大体总结,后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目,导入hive依赖 创建类继承 GenericUDF(自定义函数的抽象类)(实现…

仓库管理软件有哪些功能?2023仓库管理软件该如何选?

对于现代企业或批发零售商,高效的仓库管理是确保供应链运作顺畅、库存控制精准的关键要素。在数字化时代,越来越多的企业和商户意识到采用仓库管理软件的重要性。 无论您是中小型企业还是中小商户,仓库管理都是不可忽视的一环。 一、选择仓库…

边缘计算在智慧校园应用,实现校园智能化管理

随着科技的发展和互联网技术进步,校园管理正逐步实现数字化、智能化转型。边缘计算作为一种新兴技术,通过在离数据源较近的地方进行数据处理,实现了实时性分析与响应,为校园带来了更智能、安全的管理方式。 学生学习状态监控 AI动…

AI Chat 设计模式:8. 门面(外观)模式

本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 请介绍一下门面模式A.1Q.2 该模式由哪些角色组成呢A.2Q.3 举一个门面模式的例子A.3Q.4…

串口wifi6+蓝牙二合一系列模块选型参考和外围电路参考设计-WG236/WG237

针对物联网数据传输,智能控制等应用场景研发推出的高集成小尺寸串口WiFi串口蓝牙的二合一组合模块。WiFi符合802.11a/b/g/n无线标准,蓝牙支持低功耗蓝牙V4.2/V5.0 BLE/V2.1和EDR,WiFi部分的接口是UART,蓝牙部分是UART/PCM 接口。模…

深入解析浏览器Cookie(图文码教学)

深入解析浏览器Cookie 前言一、什么是 Cookie?二、Cookie的特点二、如何创建 Cookie?三、服务器如何获取 Cookie四、Cookie 值的修改4.1 方案一4.2 方案二 五、浏览器查看 Cookie六、Cookie 生命控制七、Cookie 有效路径 Path 的设置八、案例:Cookie 练…

经典常谈思维导图怎么制作?手把手教你制作

经典常谈思维导图怎么制作?创建思维导图可以帮助我们更好地组织和整理信息,帮助我们更好地理解和记忆信息。它可以使我们更高效地学习和工作,并帮助我们更好地表达和分享我们的想法和想法。因此,制作思维导图是一种非常有用的技能…

回首2023上半年:成长、思考、感恩

文章目录 每日一句正能量前言一、目标达成情况总结二、工作和学习成果总结三、下半年规划总结四、个人想法 后记附录 每日一句正能量 做一个向日葵族,面对阳光,不自艾自怜,每天活出最灿烂的自己。曾经拥有的,不要忘记。不能得到的…

2023-7-12-第十七式状态模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

为什么单片机可以直接烧录程序的原因是什么?

单片机(Microcontroller)可以直接烧录程序的原因主要有以下几点: 集成性:单片机是一种高度集成的芯片,内部包含了处理器核心(CPU)、存储器(如闪存、EEPROM、RAM等)、输入…

Linux: USB Gadget 驱动简介

文章目录 1. 前言2. 背景3. USB Gadget 驱动3.1 什么是 USB Gadget 驱动?3.2 USB Gadget 驱动框架3.3 USB 设备控制器(UDC) 驱动3.3.1 USB 设备控制器(UDC) 驱动 概述3.3.2 USB 设备控制器(UDC) 驱动示例 3.4 USB Gadget Function 驱动3.5 USB Gadget 驱动3.5.1 USB…

微服务系列文章之 nginx负载均衡

nginx负载均衡 负载均衡建立在现有网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 随着网站的发展,服务器压力越来越大,我们可能首先会将数…

CentOS 安装字体 微软雅黑

fc-list命令查看已经安装的字体 fc-list :langzh命令可以查看已安装的中文字体 找到windows系统里面的字体 上传到服务器 /usr/share/fonts/winFonts 下,winFonts目录是自己建立的,名称无要求 如果C:\Windows\Fonts下的字体没法直接传输将这个文件夹复…

东方通信基于 KubeSphere 的云计算落地经验

作者:周峰 吴昌泰 公司简介 东方通信股份有限公司(以下简称“东方通信”)创立于 1958 年,是一家集硬件设备、软件、服务为一体的整体解决方案提供商。公司于 1996 年成功改制上市,成为上海证交所同时发行 A 股和 B 股…

jenkins手把手教你从入门到放弃01-jenkins简介(详解)

一、简介 jenkins是一个可扩展的持续集成引擎。持续集成,也就是通常所说的CI(Continues Integration),可以说是现代软件技术开发的基础。持续集成是一种软件开发实践, 即团队开发成员经常集成他们的工作,通…