浅谈 java 虚拟机 JVM

news2024/11/22 19:39:29

 前言

小亭子正在努力的学习编程,接下来将开启JavaEE的学习~~

分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~

同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~

目录

 前言

JVM中的内存划分

JVM的类加载机制

1.加载 :

2.验证:

3.准备:

4.解析:

5.初始化

双亲委派模型

JVM中的垃圾回收机制 ( GC)

GC主要分为两个阶段:

找谁是垃圾

1.引用计数:

2.可达性分析

释放内存

标记清除

复制算法

标记整理

垃圾收集器

⾯试题 :


JVM中的内存划分

java其实就是一个java进程,会从操作系统中申请一大块内存区域给java代码使用,并进一步划分给出不同的用途。 

JVM 运行时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型((Java MemoryModel,简称JMM)完全不同,属于完全不同的两个概念,它由以下 5 大部分组成:

  •  程序计数器: 用途是记录当前程序执行到那个指令了,里面是简单的long 类型的变量存了一个内存地址,这个内存地址就是下一个要执行的字节码所在的地址。
  • 本地方法栈:是给JVM内部的本地方法使用的【JVM内部是c++实现的】
  • 虚拟机栈:是给java代码使用的
  • 堆:程序中创建的所有对象都在保存在堆中
  • 方法区/元数据区:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

注意:堆和元数据区【共享的】,在一个JVM中只有一个,栈和程序计数器则是有多份,每个线程都有一份【线程私有的】。

其中,最核心的区域:

1.堆  :new 出来的对象,【成员变量】

2.栈 : 维护方法之间的调用关系 【局部变量】

3. 方法区/元数据区 /元空间 :放的是类加载之后的类对象 【静态变量】


JVM的类加载机制

类加载的过程:把 .class 文件加载到内存,得到类对象这样的过程

分为五步:加载,验证,准备,解析,初始化

1.加载 :

找到.class文件,并读文件内容

2.验证:

验证选项:
文件格式验证
字节码验证
符号引用验证...

.class文件有明确的数据格式(二进制的)

3.准备:

给类对象分配内存空间(未初始化的空间,数据全是0的,类对象中的静态变量啥的全是0,相当于租了个毛坯房)

4.解析:

针对字符串常量进行初始化【字符串常量池中的符号引用替换为直接引用的过程】

相当于之前是只知道彼此之间的相对位置,这时候字符串常量就是符号引用,真正加载到内存中就会把字符串常量填充到内存的特定位置上,字符串之间的相对位置还是一样,但是这些字符串有了自己真正的内存地址。此时的字符串就是直接引用(java中的普通引用)

【打个比方:开学排座位的时候,学校通知按照学号排,你只知道你前面一个位置是小明的,但是你不知道你具体坐在第几排,排好座位以后你知道了自己在第三排,小明在第二排,你们知道了自己的具体位置,并且你们之间的相对位置没变,小明还是在你前面一个。】

5.初始化

针对类对象进行初始化(初始化静态成员,执行静态代码块,类要是有父类还需要加载父类)

注意:类加载这个动作不是JVM一启动就把所有.class文件都加载的,整体是一个“懒加载”的策略(懒汉模式),非必要不加载。

所谓的“必要”情况:

  1. 创建了这个类的实例
  2. 使用了这个类的静态方法/属性
  3. 使用了子类,会触发父类的加载

双亲委派模型

【说在前面:双亲其实只有一个准确的说是父亲,(都是翻译的锅)】

JVM中加载类,需要用到一组特殊的模块,类加载器,JVM内置了三个类加载器(程序员也可以定义自己的类加载器)

  1. BootStrap  ClassLoader:启动类加载器:加载 JDK 中 lib ⽬录中 Java 的核⼼类库,即$JAVA_HOME/lib⽬录
  2. Exttension ClassLoader :扩展类加载器。加载 lib/ext ⽬录下的类,非标准的但是是Sun/Oreacle 扩展的库的类库
  3.  Application ClassLoader:应⽤程序类加载器。负责加载项目中自己写的类,以及第三方库中的类。

具体加载一个类的过程:
注意:双亲委派模型是可以打破的,比如tomcat就没有遵守


JVM中的垃圾回收机制 ( GC)

垃圾回收机制主要是帮助程序员自动释放内存的

【这里说的是基本思想,JVM具体是怎么实现的,这个问题很复杂,就不讨论了】

程序计数器,就是单纯存地址的整数,跟随线程一起销毁

栈,方法调用完毕,方法的局部变量也随着线程一起销毁

元数据区,存的是类对象,很少会“卸载”

所以,堆就是GC的主要目标

GC是以对象为单位进行释放的,【说是释放内存,其实就是释放对象】

GC主要分为两个阶段:

找谁是垃圾,释放内存

找谁是垃圾

一个对象,如果后序不在用了,就可以认为是 垃圾

java中使用一个对象,只能通过引用,所以java单纯地通过引用有没有指向来判定是不是垃圾

通常有两种方法:引用计数,可达性分析

1.引用计数:

给对象安排一个额外的空间,保存一个整数,表示该对象有指向【java没有使用这个方法,Python,php用了】

2.可达性分析

把对象之间的引用关系理解成一个树形结构,从一些特殊的起点出发。进行遍历,只要遍历能访问到的对象就是“可达”的,再把“不可达”的当做垃圾即可。 

 可达性分析关键要点进行上述遍历需要有  “起点”

  1. 栈上的局部变量(每个栈的每个局部变量都是起点。)
  2. 常量池中引用的对象
  3. 方法区中静态成员引用的对象。

可达性分析总的来说就是从所有的gc roots的起点出发,看看该对象里又通过引用能访问哪些对象,顺藤摸瓜的,把所有可以访问的对象都给变了一遍。便利的同时把对象标记成可达,剩下的自然就是不可达。

可达性分析克服了引用技术的两个缺点。但是也有自己的问题。

  1. 因为要遍历所有对象,需要消耗更多的时间,因此某个对象成了垃圾,也不能第一时间发现。
  2. 在进行可达性分析的时候要顺藤摸瓜,一旦这个过程中当前代码中引对象的引用关系发生了变化,就会出现问题。【STW问题(让其他业务线暂停),现在已经能很好的应对了】

释放内存

有三种策略:标记清除,复制算法,标记整理

标记清除

缺点:内存碎片化

复制算法

缺点:

内存空间利用率低,复制成本高

标记整理


上述三种策略都有缺点,所以,实际上 JVM 的实现思路,是结合了上述几种思想方法,针对不同情况采取不同策略,产生了 :分代回收思想

垃圾收集器

如果说上⾯我们讲的收集算法是内存回收的⽅法论,那么垃圾收集器就是内存回收的具体实现。

【本文就不介绍了。】


⾯试题 :

请问了解Minor GC和Full GC么,这两种GC有什么不⼀样吗?

1. Minor GC⼜称为新⽣代GC : 指的是发⽣在新⽣代的垃圾收集。因为Java对象⼤多都具备朝⽣夕灭的特性,因此MinorGC(采⽤复制算法)⾮常频繁,⼀般回收速度也⽐较快。

2. Full GC ⼜称为 ⽼年代GC或者Major GC : 指发⽣在⽼年代的垃圾收集。出现了Major GC,经常会伴随⾄少⼀次的MinorGC(并⾮绝对,在Parallel Scavenge收集器中就有直接进⾏Full GC的策略选择过程)。Major GC的速度⼀般会⽐MinorGC慢10倍以上


以上就是本文分享的主要内容,对你有帮助的话,可以点个赞哦~~

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

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

相关文章

今天我们要向您介绍的是一款来自厂家的劲道半干面 - 味尚拉面

尊敬的顾客您好,感谢您选择我们的电商平台。今天我们要向您介绍的是一款来自厂家的劲道半干面 - 味尚拉面。 味尚拉面是一款经典的面食品牌,以选用高品质面粉和精选优质食材为特点,采用独特工艺制作而成。其中,味尚拉面的半干面更…

ChatGPT 最佳实践指南之:给 GPT 足够的时间“思考”

Give GPTs time to "think" 给予 GPT 足够的时间“思考” If asked to multiply 17 by 28, you might not know it instantly, but can still work it out with time. Similarly, GPTs make more reasoning errors when trying to answer right away, rather than ta…

Modbus TCP/BACnet IP/MQTT物联网网关IOT-810介绍及其典型应用

伴随着计算机技术以及互联网的发展,物联网这个概念已经逐渐进入我们的日常生活,例如智能泊车,智能家居,智能照明,智能楼宇等。智能楼宇是将传统的楼宇自控系统与物联网技术相融合,把系统中常见的传感器、设…

克服 ClickHouse 运维难题:ByteHouse 水平扩容功能上线

前言 对于分析型数据库产品,通过增加服务节点实现集群水平扩容,并提升集群性能和容量,是运维的必要手段。 但是对于熟悉 ClickHouse 的工程师而言,听到“扩容”二字一定会头疼不已。开源 ClickHouse 的 MPP 架构导致扩容成本高&…

【前缀和优化DP】ABC 222D

虽然很简单&#xff0c;但是统一一下板子&#xff0c;以防写错 D - Between Two Arrays (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 直接DP即可 Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn3e310; const…

ASP.NET Website 项目 .NET Framework 4.0 ~ .NET Framework 4.8支持c#哪些版本(Website)

本文讲的是Website网站项目&#xff0c;由于维护老项目Website .net framework4.0&#xff0c;遇到c#6.0语法不支持。便做了点记录 ASP.NET Website 项目 .NET Framework 4.0、 .NET Framework 4.5、 .NET Framework 4.6、 .NET Framework 4.8都支持c#哪些版本&#xff1f; 下面…

使用一行css实现黑白色主题皮肤的切换

很多网站都有切换主题的效果 比如如下所示 示例代码 <template><div class"css-switch-theme"><el-switchchange"hanldeSwitchTheme"v-model"themValue"active-text"暗黑"inactive-text"白色"active-color&q…

文件传输越来越频繁,如何选择高速文件传输解决方案

随着云计算、大数据等技术的发展和人们对文件传输速度的要求不断提高&#xff0c;高速文件传输成为个人和企业之间必不可少的需求。在这个背景下&#xff0c;如何实现安全、稳定、高效的文件传输就成为了一个热门话题。本文将从以下几个方面&#xff0c;详细介绍 高速文件传输解…

SpringBoot 集成 Mybatis

SpringBoot 集成 Mybatis 详细教程 &#xff08;只有操作&#xff0c;没有理论&#xff0c;仅供参考学习&#xff09; 一、操作部分 1. 准备数据库 1.1 数据库版本&#xff1a; C:\WINDOWS\system32>mysql -V mysql Ver 8.0.25 for Win64 on x86_64 (MySQL Community …

深入解读:多人语音聊天室源码开发搭建社交分享功能

在生活中&#xff0c;流传着这么一句谚语&#xff0c;叫“赠人玫瑰&#xff0c;手有余香”&#xff0c;这句谚语大致意思就是劝导人们&#xff0c;分享给别人好的东西&#xff0c;自己也会有好处&#xff0c;收获到快乐。分享也是我们日常生活中社交的一种方式&#xff0c;当我…

【技能实训】DMS数据挖掘项目-Day08

文章目录 任务8【任务8.1.1】对IDataAnalyse类方法返回值使用泛型集合升级【任务8.1.2】对DataFilter类成员属性使用泛型集合升级&#xff0c;类型参数是有界的&#xff08;DataBase的子类&#xff09;【任务8.2】对LogRecAnalyse类成员属性使用泛型集合升级,相关数据集合进行泛…

SaaS私有云智慧校园电子班牌系统源码

智慧校园APP源码人脸识别系统 电子班牌云平台源码 SaaS私有云部署模式 电子班牌又称智慧班牌&#xff0c;是打造智慧校园的必需品&#xff0c;它可以展示班级信息、时间天气、班容班貌、通知公告、考勤签到、课程安排、值日安排等信息&#xff0c;无纸化电子设备&#xff0c;后…

剑指Offer-学习计划(二)链表篇

剑指 Offer 06. 从尾到头打印链表https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 剑指 Offer 35. 复杂链表的复制https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/剑指 Offer 24. 反转链表https://leetcode.cn/problems/fan-zhuan-lian…

(37)安全开关

文章目录 前言 37.1 LED的含义 37.2 配置安全开关 37.3 使用安全开关强制更新I/O板固件 前言 一个安全开关可以用来启用/禁用电机和伺服的输出。该开关控制飞行器的"安全"状态。当处于这种状态时&#xff0c;电机被阻止运行&#xff08;除了在 Planes MANUAL 模…

2023年9月山东/厦门/南宁/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

记一次在forEach循环中使用异步代码无效

背景 代码如下&#xff1a; const res1 await getOrderPackage({XM_LX: "95", // 入院检查套餐 }); const res2 await getOrderPackage({XM_LX: "98", // 入院检验套餐 });const res [...res1.data, ...res2.data] let retList: any[] []; const map: …

一万字带你吃透RocketMQ

前言 工作中很多种场景下会用到消息队列&#xff0c;消息队列简单来说就是 消息的传输过程中保存消息的容器。消息队列主要解决了应用耦合、异步处理、流量削峰等问题。今天我们来了解一下阿里开源的一款产品 RocketMQ。 RocketMQ简介 RocketMQ 是一款低延迟、高并发、高可用…

SEM代运营费用解析:为什么值得投资?

随着企业竞争的日益激烈&#xff0c;SEM&#xff08;搜索引擎营销&#xff09;作为一种重要的数字营销手段&#xff0c;已经成为各类企业不可或缺的一部分。然而&#xff0c;在进行SEM代运营时&#xff0c;很多企业都会关心费用问题。本文将为您解析SEM代运营费用的组成和投资价…

React中的key有什么作用?

一、是什么 首先&#xff0c;先给出react组件中进行列表渲染的一个示例&#xff1a; const data [{ id: 0, name: abc },{ id: 1, name: def },{ id: 2, name: ghi },{ id: 3, name: jkl } ];const ListItem (props) > {return <li>{props.name}</li>; };co…

网络安全(黑客技术)自学笔记

首先给大家简单介绍一下网络安全&#xff1a; 1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、…