【JVM】(内存区域划分 为什么要划分 具体如何分 类加载机制 类加载基本流程 双亲委派模型 类加载器 垃圾回收机制(GC))

文章目录

  • 内存区域划分
    • 为什么要划分
    • 具体如何分
  • 类加载机制
    • 类加载基本流程
    • 双亲委派模型
      • 类加载器
  • 垃圾回收机制(GC)


内存区域划分

为什么要划分

JVM启动的时候会申请到一整个很大的内存区域,JVM是一个应用程序,要从操作系统这里申请内存,JVM就需要根据,把空间,分成几个部分,每个部分各自有不同的功能作用.

具体如何分

在这里插入图片描述

存放new出来的对象
方法区/元数据区,存放类对象(类加载之后,存放的位置)
存放方法之间的调用关系
程序计数器 存放每个线程,下一条要执行的指令的地址

在这里插入图片描述

类加载机制

类加载基本流程

java代码会被编译成.class文件(包含一些字节码),java程序要想运行起来,就需要让jvm读取到这些.class文件,并且把里面的内容,构造成类对象,保存到内存的方法区中。所谓的执行代码就是调用方法。
书上和官方文档把类加载过程分成了5个步骤。

  1. 加载:找到.class文件,打开文件,读取到文件内容。
  2. 验证:.class文件是一个二进制的格式。(某个字节,都是具有特定含义的),就需要验证你当前读到的这个格式是否符合要求。
  3. 准备:给类对象分配内存空间。(只分配内存空间,没有初始化,此时空间上的内存的数值是0,此时如果尝试打印类的static成员,就是全0的)
  4. 解析:针对类对象中包含的字符串常量进行处理,进行一些初始化操作。(java代码中用到的字符串常量在编译之后也会进入到.class文件中)这个过程也叫做:把“符号引用”(文件偏移量)替换成“直接引用”(内存地址)。
  5. 初始化:针对类对象进行初始化,把类对象中需要的各个属性都设置好,还需要初始化好static成员,还需要执行静态代码块,还可能需要加载一下父类。

双亲委派模型

属于类加载中,第一个步骤“加载”过程中国,其中的一个环节。
负责根据全限定类名找到.class文件。

所谓的“双亲委派模型”就是一个查找优先级问题。

类加载器

是JVM中的一个模块,在JVM中内置了三个类加载器。

  1. BootStrap ClassLoader
  2. Extension ClassLoader
  3. Application ClassLoader

上述三个类加载有父子关系,3是子 2是父 3是爷。
在这里插入图片描述

双亲委派模型过程:

类加载的过程(找class文件的过程)

  • 给定一个类的全限定类名,形如java.lang.String。
  • 从Application ClassLoader作为入口,开始执行查找的逻辑。
  • Application ClassLoader,不会立即去扫描自己负责的目录(负责的是搜索项目点前目录和第三方库对应的目录)而是把查找的任务,交给他的父亲,Extension ClassLoader。
  • Extension ClassLoader 也不会立即去扫描自己负责的目录,(负责的是JDK中一些扩展的库,对应的目录)而是把查找的任务,交给他的父亲,BootStrap ClassLoader。
  • BootStrap ClassLoader 也不想立即扫描自己负责的目录,(负责的是标准库的目录),也想把任务交给它的父亲,结果发现自己没有父亲,因此BootStrap ClassLoader只能亲自负责扫描,标准库的目录。java.lang.String这种类就能够在标准库中,找到对应的.class文件,就可以进行打开文件,读取文件后续操作。此时查找.class文件的过程就结束了。但是,如果给定的类不是标准库的类,任务仍然会被交给孩子来执行。
  • 如果没有扫描到就会回到Extension ClassLoader。Extension ClassLoader就会扫描负责的扩展库的目录,如果找到,就执行后续的类加载操作,此时查找过程结束,如果没找到,还是把任务交给孩子来执行。
  • 没有扫描到,就会回到Application ClassLoader,Application ClassLoader就会负责扫描当前目录和第三方库的目录,如果找到,就会执行后续的类加载操作,如果没找到,就会抛出一个ClassNotFoundExcepton。

之所以搞这一套流程,主要目的是为了确保,标准库的类,被加载的优先级最高,其次是扩展库,最后是自己写的类和第三方库

在这里插入图片描述

在这里插入图片描述

垃圾回收机制(GC)

让JVM自行判定,某个内存是否就不再使用了,如果这个内存后面确实不用了,JVM就会自动的把这个内存给回收掉,此时就不必要让程序员自己手动写代码回收。

GC这么好为什么C++不引入GC呢?

  1. 系统缺陷,需要一个/一些特定的线程,不停的扫描内存中的所有的对象,看是否能够回收。此时是需要额外的内存 + CPU资源的。C++要考虑能兼容一些配置特别低的系统。
  2. 效率问题,这样的扫描线程,不一定能够及时的释放内存(扫描总是有一定周期的),一旦同一时刻,出现大量的对象都需要被回收GC产生的负担就会很大,甚至引起整个程序都卡顿。(STW问题 stop the world)。
    GC是垃圾回收,GC回收的目标是内存中的对象,对于Java来说就是new出来的对象。栈里的局部变量,是跟随栈帧的生命周期走的。(方法执行结束,栈帧销毁,内存自然释放)
    静态变量,生命周期就是整个程序,这个始终存在,就意味着静态变量是无需释放的。

GC可以理解成两个大的步骤:

  • 找到垃圾
  1. 引用计数(Python PHP)
    new出来的对象,单独安排一块空间,来保存一个计数器。
    在这里插入图片描述
    缺陷:
    1.浪费内存
    在这里插入图片描述
    2.引用计数机制,存在“循环引用”问题。

在这里插入图片描述
此时第一个对象和第二对象互相引用,要想使用第一个对象,就需要先拿到第二个对象,如果想要拿到第二个对象,又得先拿到第一个对象,这里就非常像死锁。

  1. 可达性分析(Java)

本质上就是时间换空间这样的手段,有一个/一组线程,周期性的扫描我们代码中所有的对象。(从一些特定的对象触发,尽可能的进行访问的遍历,把所有能够访问到的对象都标记成“可达”,反之经过扫描之后,未被标记的对象就是垃圾(“不可达”)了)
可达性分析出发点很多,不仅仅是所有的局部变量,还有常量池中引用的对象,还有方法区中的静态引用的变量。 这些统称为GCRoots。
可达性分析都是周期性进行的,当前某个对象是否是垃圾,是随着代码的执行,会发生改变。(可达性分析比较消耗系统资源,开销比较大)

  • 回收垃圾

三种基本思路

  1. 标记清除

把对应的对象,直接释放掉,就是标记清楚的方案,这个方案会产生很多的内存碎片,释放内存是为了让别的代码能够申请,申请内存,都是申请到“连续”的内存空间。

优点:实现简单。

缺点:产生不连续的内存碎片,如果程序需要分配一个连续内存的大对象时,就需要提前触发一次垃圾回收。

在这里插入图片描述

  1. 复制算法

通过复制的方式把有效的对象,归类到一起,再统一释放剩下的空间。

在这里插入图片描述
优点:执行效率高,没有内存碎片的问题。

缺点:空间利用率低,因为复制算法每次只能使用一半的内存。

  1. 标记整理

既能够解决内存碎片化的问题,又能够处理复制算法中利用率低的问题。

类似于顺序表删除元素的搬运操作。搬运的开销仍然很大。
在这里插入图片描述
优点:解决了内存碎片问题,比复制算法空间利用率高。

缺点:因为有局部对象移动,所以效率不是很高。

实际上JVM采取的释放思路,是上述基础思路结结合体,让上述方案扬长避短。

分代回收:

在这里插入图片描述

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

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

相关文章

Android Studio字体大小调节

外观页面字体调节 settings->Appearance->User cunstom font 代码字体调节 Settings->Editor->Font此时logcat窗口、Build窗口和Ternimal窗口字体大小也会同步调节(2023.2.1版本上验证)

基于Springboot和Redis实现的快递代取系统

1.项目简介 本项目基于springboot框架开发而成,前端采用bootstrap和layer框架开发,系统功能完整,界面简洁大方,比较适合做毕业设计使用。 本项目主要实现了代取快递的信息管理功能,使用角色有三类:一是客…

Elasticsearch 主副分片切换过程中对业务写入有影响吗

🍊🍉🍋 先说下结论,只要集群中的工作节点过半,有候选的master节点,挂掉的节点中不同时包含索引的主分片和副分片,那么ES是可以做到让业务无感知的进行主副分片切换的。 蓝胖子会先讲解下ES集群写…

ARM_基础之RAS

Reliability, Availability, and Serviceability (RAS), for A-profile architecture 源自 https://developer.arm.com/documentation/102105/latest/ 1 Introduction to RAS 1.1 Faults,Errors,and failures 三个概念的区分: • A failure is the event of devia…

外包干了3天,技术明显进步。。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时,输入参数名称搜索,搜出来的同名参数结果有多个,分布在一个表格的不同行,表格是动态加载的,需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改? 2、网页元素…

JVM学习-JVM的自动优化

目录 1.语法糖 1.1默认构造器 1.2自动拆装箱 1.3泛型集合取值 1.4可变参数实现 1.5 foreach循环 1.6 switch配合String使用 1.7 switch配合枚举使用​编辑 1.8 try-with-resources 1.9方法重写的桥接方法 2.运行时优化 2.1分层优化以及逃逸分析 2.2方法内联 2.3字段优化 JVM会…

产品推荐 - 基于FPGA XC7K325T+DSP TMS320C6678的双目交汇视觉图像处理平台

一、产品概述 TES601是一款基于FPGA与DSP协同处理架构的双目交汇视觉图像处理系统平台,该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为核心处理单元,来完成视觉图像处理算法,采用1片Xilinx的Kintex-7系列FPGA XC7K325T作为视…

​​SQLiteC/C++接口详细介绍之sqlite3类(十)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(九) 下一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十一) 30.sqlite3_enable_load_extension&#x…

三、NLP中的句子关系判断

句子关系判断是指判断句子是否相似,是否包含,是否是问答关系等,常应用在文本去重、检索(用户输入和文档的相关性)、推荐(和用户喜好文章是否相似)等场景中。 3.0、文本相似度计算 3.0.0 传统机…

更改el-tabs默认样式,实现tab标签居中显示,标签对应内容使用另一个div显示

首先看效果图 如图所示&#xff0c;标签在浏览器窗口居中&#xff0c;但是下面的内容依然是默认从左到右&#xff0c;不会受到tab样式的影响 <template><div><div style"display: flex; justify-content: center; align-items: center;"><el-…

JVM学习-JVM简介以及其内部结构

目录 1.什么是JVM 2.JVM、JRE、JDK、JavaSE、JavaEE之间的联系 3.JVM的内部结构 4.各部分的作用 4.1 类加载器 4.2 方法区 4.3 堆 ​编辑 4.4 虚拟机栈 4.5 程序计数器 4.6 本地方法栈 4.7 解释器和JIT即时编译器 4.9 GC垃圾回收 5.拓展 5.1一些可能会遇到的问…

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…

dp入门:从暴力dfs 到 dp

本篇为小金鱼大佬视频的学习笔记&#xff0c;原视频链接&#xff1a;https://www.bilibili.com/video/BV1r84y1379W?vd_source726e10ea5b787a300ceada715f64b4bf 基础概念 暴力dfs很多时候仅能过部分测试点&#xff0c;要想将其优化&#xff0c;一般以 dfs -> 记忆化搜索 …

汽车IVI中控开发入门及进阶(十三):语音识别

前言: IVI中控上的语音识别,在目前市场上也是非常显眼的一个创新,大幅改变了传统IVI的操作习惯。 语音识别Speech recognition,也称为自动语音识别(ASR)、计算机语音识别或语音到文本,是一种使程序能够将人类语音处理成书面格式的能力。 语音识别Speech recognition是计…

1.6w字数据库基础知识超详细解析~‍(进阶/复习版)

文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT&#xff1a;默认值约束5 PRIMARY KEY&#xff1a;主键约束6 FOREIGN KEY&#xff1a;外键约束…

Calendar类 --java学习笔记

Calendar 代表的是系统此刻时间对应的日历通过它可以单独获取、修改时间中的年、月、日、时、分、秒等 常见方法&#xff1a; 创建Calendar对象&#xff1a; 用Calendar.getInStance&#xff08;&#xff09;方法&#xff0c;返回一个此时此刻的日历&#xff08;Calendar&am…

关于IP地址证书的申请

对于直接通过IP地址访问的服务器&#xff0c;为其配置SSL证书同样至关重要。以下是一份详尽的指南&#xff0c;教你如何为你的IP地址申请SSL证书。 IP地址证书目前有DV验证和OV验证两种主流的验证方式&#xff0c;DV验证只需验证IP的所有权&#xff0c;OV的在此基础上&#xff…

换根dp,LeetCode310. 最小高度树

一、题目 1、题目描述 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;一个任何没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#…