学会JVM,从这篇开始
创始人
2024-04-26 21:29:09
0

目录

一、了解 JVM 

二、JVM内存划分

三、类加载

1. 类加载是干啥的?

什么是类对象 ?

2. 类加载的大致过程

3. 什么是 双亲委派模型(重点) ? 

四、GC

1. GC回收的是哪里的内存

2. 回收如何判断某个对象是否是垃圾?

① 引用计数(Python PHP采用)

② 可达性分析(JVM采用)

3. 如何回收

① 标记清除

② 复制算法

③ 标记整理

④ 分代回收:综合了上述方法,根据对象不同的特点,用不同的方法

垃圾回收器


 

 

一、了解 JVM 

JVM ( Java Virtual Machine ),又称之为 Java虚拟机。JVM 的运行与操作系统无关,能够实现跨平台,只要是安装了JVM的机器,都能运行Java程序,Java语言最重要的特点 "跨平台运行",也正是这个原因。

想要详细了解 Java 推荐大家一本书 << 深入理解Java虚拟机>> (周志明)

而不作为 这个垂直领域(开发编译器 等..)的程序员,我们工作中所要知道的并不多,只需熟记下面的内容。

 

二、JVM内存划分

Java 程序,就是一个名为 Java的进程,这个进程就是“JVM”,JVM会先从操作系统里申请一大块空间,在这个基础上再划分成几个小的区域。(可以理解成你买个房子,你会规划一下厨房\客厅\卧室...)。而学习JVM内存划分,就是学习这几个区域。

  •  堆  :存放 new 的对象。
  •  方法区:存放 类对象(加载好的类)。
  •  栈 :分为“本地方法栈”和“虚拟机栈”。本地方法栈:存放本地方法之间的调用关系(本地方法指的是JVM内部使用C++写的代码)。虚拟机栈:用来保存调用关系的内存空间。
  •  程序计数器 :放的是下一个要执行的指令的地址。

牢记:局部变量存放在栈上。成员变量存放在堆上。静态变量是在类对象里,也就是在方法区中。

 

三、类加载

1. 类加载是干啥的?

Java 程序在运行之前,是先要进行编译,将 .java文件 变成 .class文件(二进制字节码文件)

在运行的时候,JVM进程就会读取对应的 .class 文件,并解析内容,在内存中构造出类对象进行初始化......简单点说就是 将类从文件加载到内存之中

什么是类对象 ?

这个图就是 Java的官方文档截取的,左边是类型 右边是相关属性,日常开发中,我们会遇到版本不兼容的问题,就是因为类对象的格式不同,JDK8 和 JDK19还是有很多区别的。

2. 类加载的大致过程

1. 加载

2. 连接 ---->①验证②准备③解析

3. 初始化

要熟悉了解这个图!!

 

3. 什么是 双亲委派模型(重点) ? 

JVM 加载器 是由 类加载器(class loader) 这样的模块来负责的,而JVM本身自带了多个类加载器 (我们程序员也可以自己实现)。

  • Bootstrap ClassLoader  负责加载标准库中的类
  • Extension ClassLoader  负责加载JVM扩展的库的类
  • Application ClassLoader  负责加载咱们自己的项目里的自定义类

而 上述类加载器相互配合的工作过程,就是双亲委派模型

三个类加载器存在父子关系 :

加载的时候,从Application ClassLoader 开始,加载器不会立即扫描自己负责的路径,而是把任务委派给 父类加载器 先进行处理,整个过程就是按照下图的过程,如果最后没有找到,就会报错 “类加载失败”。

 

 

四、GC

  • GC(Garbage Collection):垃圾回收机制 
  • 当我们呢申请内存,但不进行释放的时候,就会产生 内存泄漏 ,而手动释放又太麻烦,就产生了GC垃圾回收机制,也就是JVM自动释放垃圾的方式。Python PHP JS Go Java ....。
  • C++并没有GC,原因是 GC有一个 STW问题 ,也就是在特定的时候,会产生卡顿,而C++追求的是机制的快。C++使用的是“智能指针”。

 

1. GC回收的是哪里的内存

  • 堆:GC主要回收的地方
  • 方法区:类对象,加载之后一般不会卸载
  • 栈:成员变量,释放的时间确定,不必回收
  • 程序计数器:固定内存空间,不必回收

而 主要回收的堆 又分为几块,如下图:

 

 

2. 回收如何判断某个对象是否是垃圾?

通过判断是否存在引用指向,确定这个对象是否使用,如果不存在引用对象则就可以释放。释放的方式有两种典型的方法,分别是 引用计数 和 可达性分析

① 引用计数(Python PHP采用)

给每个对象都加上一个计数器,这个计数器就表示 当前的对象有几个引用。当计数器的值为 0 的时候,表示这个对象已经没有引用指向,也表示无法被使用了,这时候就被认为是垃圾。

优点:① 空间利用率低(当是int类型的对象的时候,还有加一个计数器)

           ② 可能出现 循环引用 的问题,例如下面代码

public class Test {Test test;public static void main(String[] args) {Test a = new Test(); //a对应的对象 +1=1Test b = new Test(); //b对应的对象 +1=1a.test = b; //b对应的对象 +1=2b.test = a; //a对应的对象 +1=2a = null; //a对应的对象 -1=1b = null; //b对应的对象 -1=1// 我们会发现 这时候 a对应的对象 和 b对应的对象 计数器内的值都为1// 但是实际上 并没有引用指向它们,这就是循环引用的问题,计数器无法归零}
}

② 可达性分析(JVM采用)

约定一些特定的变量作为“GC Roots”。每隔一段时间,就从 GC Roots 出发,进行遍历,看看哪些变量能够被访问到(可达),哪些不能被访问(不可达)。

约定的GC Roots:①栈上的变量 ②常量池引用的对象 ③方法区 引用类型的静态变量

3. 如何回收

① 标记清除

 

② 复制算法

 

 

③ 标记整理

④ 分代回收:综合了上述方法,根据对象不同的特点,用不同的方法

 

垃圾回收器

其实上面的内容都是“纸上谈兵”,真枪实弹的是垃圾回收器,而常见的垃圾回收器可以了解一下CMS、G1、ZGC(Java15开始使用),可以后期了解。

相关内容

热门资讯

安卓系统自带的网页,功能与特色... 你有没有发现,每次打开安卓手机,那熟悉的系统界面里总有一个默默无闻的小家伙——安卓系统自带的网页浏览...
美咖云系统安卓版,开启智能生活... 你有没有发现,最近手机上多了一个叫“美咖云系统安卓版”的小家伙?它就像一个魔法师,轻轻一点,就能让你...
安卓系统推荐最好的手机,盘点性... 你有没有想过,拥有一部性能卓越的手机,就像是拥有了移动的宝藏库?在这个信息爆炸的时代,一部好手机不仅...
安卓11系统能精简吗,释放潜能 你有没有发现,随着手机越来越智能,系统也越来越庞大?安卓11系统,这个最新的操作系统,是不是也让你觉...
安卓自动重启系统软件,揭秘原因... 手机突然自动重启,是不是感觉整个人都不好了?别急,今天就来和你聊聊这个让人头疼的安卓自动重启系统软件...
苹果手机x刷安卓系统,探索安卓... 你有没有想过,你的苹果手机X竟然也能刷上安卓系统?是的,你没听错,就是那个一直以来都和我们苹果手机X...
安卓系统智商低吗,智商低下的真... 你有没有想过,为什么安卓系统的智商总被调侃得好像有点低呢?是不是觉得它总是慢吞吞的,有时候还犯点小错...
安卓系统手机联系人,揭秘你的社... 你有没有发现,手机里的联系人列表就像是一个小小的社交圈呢?里面藏着我们的亲朋好友、工作伙伴,甚至还有...
安卓系统免费铃声下载,打造个性... 手机里那首老掉牙的铃声是不是让你觉得有点out了呢?别急,今天就来给你支个招,让你轻松给安卓手机换上...
安卓系统用哪个桌面好,打造个性... 你有没有发现,手机桌面可是我们每天都要面对的“脸面”呢?换一个好看的桌面,心情都能跟着好起来。那么,...
虚拟大师是安卓10系统,功能与... 你知道吗?最近在手机圈里,有个新玩意儿引起了不小的轰动,那就是虚拟大师!而且,更让人惊喜的是,这个虚...
安卓系统与苹果优缺点,系统优缺... 说到手机操作系统,安卓和苹果绝对是两大巨头,它们各有各的特色,就像两道不同的美味佳肴,让人难以抉择。...
安卓win双系统主板,融合与创... 你有没有想过,一台电脑如果既能流畅运行安卓系统,又能轻松驾驭Windows系统,那该有多爽啊?没错,...
安卓系统可精简软件,轻松提升手... 你有没有发现,手机里的安卓系统越来越庞大,软件也越装越多,有时候感觉手机就像个“大肚子”,不仅运行速...
安卓系统基于linux的代码,... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、办公的安卓系统,其实背后有着一套复杂的基于Linux的代...
苹果和安卓的拍照系统,谁更胜一... 你有没有发现,现在手机拍照已经成为我们生活中不可或缺的一部分呢?无论是记录生活的点滴,还是捕捉美丽的...
苹果和安卓系统不同吗,系统差异... 你有没有想过,为什么你的手机里装的是苹果的iOS系统,而朋友的手机却是安卓系统呢?这两种系统,看似都...
安卓系统有多少级,揭秘其多级架... 你有没有想过,那个陪伴我们日常生活的安卓系统,它其实有着丰富的层级结构呢?没错,就是那个让我们的手机...
华为鸿蒙系统与安卓的,技术融合... 你知道吗?最近科技圈可是炸开了锅,华为鸿蒙系统与安卓的较量成为了大家热议的话题。这不,今天我就来给你...
什么安卓手机是苹果系统,搭载苹... 你有没有想过,为什么有些人宁愿花大价钱买苹果手机,而有些人却对安卓手机情有独钟呢?其实,这个问题背后...