JVM(上)

news2025/1/16 2:40:43

目录

一、JVM概述

        一、JVM作用

        二、JVM整体组成部分

二、JVM结构-类加载

        一、类加载子系统概述

        二、类加载过程

        1.加载

        2.链接

        3.初始化(类加载过程中的初始化)

        三、类加载器分类

        大致分两类:

        细致分类:

        四、双亲委派机制

        五、打破双亲委派机制

三、JVM运行时数据区

        一、运行时数据区组成概述

        二、程序计数器

        特点: 

        三、Java虚拟机栈

        1、特点:

        2、栈帧构成:

        四、本地方法栈

        1、作用:

        2、特点:

        五、Java堆内存

            1、特点:

            2、堆内存区域划分:

            3、分区原因:

            4、对象创建内存分配过程

            5、堆空间的参数设置

            6、方法区


一、JVM概述

        一、JVM作用

        JVM负责把字节码文件(.class)加载到虚拟机中,再把字节码文件解释/编译为机器码,管理运算时数据存储,垃圾回收。现在JVM还可以执行其他语言编译后的字节码文件。

        二、JVM整体组成部分

        1.类加载器:从硬盘上加载字节码文件到JVM中。

        2.运行时数据区:按照不同的数据类型进行分区存储(方法区、堆、栈(用于放自己的方法)、本地方法栈(调用本地方法),程序计数器(用于线程切换,记录程序运行到那行))。

        3.执行引擎:将字节码再次编译/解释成机器码 。

        4.本地方法接口:调用本地操作系统方法接口。

其大致操作流程如下所示:

二、JVM结构-类加载

        一、类加载子系统概述

                从硬盘上加载字节码文件到JVM中。

        二、类加载过程

        

        1.加载

        以二进制字节流方式加载字节码。(通过类名/地址获取类的二进制字节流)

        在内存中为类生成一个class类对象,将静态存储转为运行时存储。(从硬盘到内存,用来生成class对象方法)

        2.链接

         1.验证:验证字节码格式是否正确,语法是否正确。   

         2.准备:为类的静态属性分配内存,并设初值。(但注意final static常量是在编译时设的初值)

         3.解析 :静态文件中符号(指令符号)引用替换成内存中直接引用。(符号引用是 Class 文件的逻辑符号,直接引用指向的方法区中某一个地址)

        3.初始化(类加载过程中的初始化)

        对类变量(静态变量进行赋值)

        类被初始化的时间有:使用类中静态变量,静态方法,运用main方法,创建对象,使用反射加载一个类,初始化类的子类优先加载父类。

        注意:当只使用类中静态常量时,类不会被初始化,因为在编译阶段就初始化了,当类在加载阶段初始化完成,才说明类的整个加载过程结果。

        三、类加载器分类

        真正实施类加载的具体实现者(事务)

        大致分两类:

        1.引导类加载器

        2.其他所有类加载器

        细致分类:

1 、引导类加载器(启动类加载器 BootStrap ClassLoader)

用 C/C++语言实现,嵌套在 JVM 内部。

Java中系统提供的类,都是由启动类加载器加载.例如:String。

只存放在JAVA_HOME>\lib 目录。

2 、扩展类加载器(Extension ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

jre/lib/ext子目录(扩展目录)下加载类库。

3、 应用程序类加载器(系统类加载器 Application ClassLoader)

由 java 语言实现,独立存在于虚拟机外部。

由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。

加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类。

4、自定义类加载器

例如:我们自己写一个类继承ClassLoader。

例如:TomCat这种容器都会有自己加载类的加载器。

        四、双亲委派机制

        当加载一个类时,先让上一级的类加载器去加载;

        直到找到引用类加载器;

        如果上级类加载器找到了,就要上级类加载器的类;

        如果上级找不到,就逐级向下委托,使用子类加载器的类;

        如果找不到报异常。

        优点:安全,避免自己编写的类替换 Java的核心类,如 java.lang.String.

        五、打破双亲委派机制

        通过自定义类加载器,重写ClassLoader类中的findClass();从而打破双亲委派机制。

三、JVM运行时数据区

        一、运行时数据区组成概述

        按照不同的数据类型进行分区存储,分为五部分:程序计数器,虚拟机栈,本地方法栈,堆,方法区。

        二、程序计数器

        用来记录程序执行指令地址。

        特点: 

        内存小,速度快 ;

        线程私有(每个线程都有自己的程序计数器);

        生命周期同线程一致;

        不会出现内存溢出(JVM中唯一区域);

        不会有垃圾回收。

        三、Java虚拟机栈

        管理(Java自己写的)方法运行,调用方法入栈,运行完成出栈。

        栈是运行时单位,一个方法入栈后可以看作一个栈帧,一个栈帧表示一个方法。

        1、特点:

        栈是线程私有的,内存可能溢出,不会有垃圾回收,快速存储访问方式(仅慢于程序计数器)。

        2、栈帧构成:

        局部变量表:存储方法中定义的变量,参数;

        操作数栈:所有计算都借助操作数栈完成;

        方法返回地址:记录被调用方法位置(从哪里来,回哪里去);

        还有动态链接和一些附加信息。

        四、本地方法栈
        1、作用:

        用于管理本地方法的调用。

        本地方法就是系统库提供方法,用native关键字修饰。例如:

       hashCode();getClass();clone();notify();notifyAll();    wait();    read0();

start0();

       2、特点:

        线程私有,可能栈溢出,不会垃圾回收。

        JVM调优:调内存大小,选择垃圾回收器。

        五、Java堆内存

        存储程序中产生对象。

            1、特点:

        线程共享,可能内存溢出,会垃圾回收(垃圾回收的重点区域是堆),是JVM 管理中最大区域,堆内存大小可调节。

           2、堆内存区域划分:

         Eden:刚创建的对象存储区。

        Survivor:存放Eden和另一个幸存者区经垃圾回收后存活下来的对象,两个幸存者区交替使用,都比较小。

        OldGen:存储生命周期长的,非常大的,经过15次回收还存活的对象。

        3、分区原因:

        可根据不同存活时间进行划分,生命周期较长的对象,放在老年区,减少垃圾回收频率和扫描次数。

        4、对象创建内存分配过程

1.新创建的对象放在Eden区,但Eden区大小有限;

2.当垃圾回收时,将Eden区存活的对象移入Survivor0中;

3.继续运行,再创建对象还是保存在Eden区。

4.下一次垃圾回收时,将Eden区存活的对象与Survivor0区中存活对象放入Survivor1中,反复交替执行;

5.当一个对象经历过15次垃圾回收次数后 仍存活,那么就将此对象移入OldGen,在对象头中4个bit位用来记录回收次数,可设置回收次数,最大值为15。

老年代:新生代 = 2:1,Eden:Survivor0:Survivor1 = 8:1:1

5、堆空间的参数设置 

JVM调优是根据程序实际运行的需要设置的参数,调整各个区间比例大小。

垃圾回收名词:

        Minor GC:针对新生代进行垃圾回收(频繁回收YoungGen)

        Major GC:针对老年代进行垃圾回收(频繁回收OldGen)

        Full GC:整堆收集 实际开发中尽量避免整堆收集。(老年代不足或方法区空间不足 时触发整堆收集)

6、方法区

        主要用于存储加载到虚拟机的类信息 。

        特点:

        方法区大小可调节,线程共享,会垃圾回收。

        方法区垃圾回收条件苛刻,要同时满足三个条件:

        1、该类的所有对象和子类对象都不存在。

        2、加载该类的加载器不存在了。

        3、该类的Class对象不被其他地方引用。

因此认为一般情况下类是不会被卸载的。

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

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

相关文章

线程和进程的区别(从JVM角度出发)

进程与线程的区别 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进…

【Godot4自学手册】第二节主人公设置

继续学习Godot,今天是第二节的内容,本节主要完成游戏玩家的设置,将玩家展现在场景中。 一、新建一个主场景 首先在场景面板中单击2D场景,如图。 这样我们就有了一个2D场景,我们将Node2D重新命名为“Main”&#xff…

使用Nginx和Fancyindex组合搭建文件下载站点详细教程

目录 简介 TIPS 1.下载Nginx 2. 安装Fancyindex和Nginx-Fancyindex-Theme模块 2.1 安装编译工具和依赖 2.2 下载Fancyindex和Nginx-Fancyindex-Theme 2.3 编译Nginx并包括Fancyindex 3. 配置Nginx 4.体验 4.1light主题 4.2dark主题 后记 简介 当使用Nginx和Fancyinde…

【轮式平衡机器人】——角度/速度/方向控制分析软件控制框架

轮式平衡机器人具有自不稳定性,可类比一级倒立摆系统的控制方法,常见有反馈线性化方法、非线性PID控制、自适应控制、自抗扰控制,还有改进的传统缺乏对外界干扰和参数改变鲁棒性的滑模变结构控制。我们采用较为简单的双闭环PID控制实现平衡模…

C++入门学习(九)浮点数

浮点型主要有两种: floatdouble 占用空间有效数字范围float4字节7位有有效数字double8字节15~16位有效数字 为什么float 有效数位 7 or 8 位,double 15 or 16 位? https://zhidao.baidu.com/question/1182732476020869219.htmlhttps://zhid…

Arduino开发实例-SDS011粉尘检测传感器驱动

SDS011粉尘检测传感器驱动 文章目录 SDS011粉尘检测传感器驱动1、SDS011介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何使用 Arduino 动粉尘传感器 SDS011 制作空气质量监测系统。 1、SDS011介绍 粉尘本身根据它们的大小分为两类。 直径在2.5至10微米之间的称为粗颗粒…

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接:力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个…

【音视频】基于ffmpeg对视频的切割/合成/推流

背景 基于FFmpeg对视频进行切割、合成和推流的价值和意义在于它提供了一种高效、灵活且免费的方式来实现视频内容的定制、管理和分发。通过FFmpeg,用户可以轻松地剪辑视频片段,根据需要去除不必要的部分或提取特定时间段的内容,从而优化观看…

网络安全行业热门认证证书合集

网络安全认证证书,就和学历一样是敲门砖,拿到了可以用不到,但不能没有;技术大牛可以没有证书,但普通人不能没有。 1.初级入门: 就像学历在职场上展示一个人的基本素养一样,网络安全认证证书可以…

机器视觉技术与应用实战(BLOB分析)

我发现写blob分析(Binary Large Object)相应的处理函数的文章非常少。那就写一写关于blob分析相关的文章。 blob工具也叫做斑点工具,先对图像进行二值化,对图像中连通区域进行计算,计算几何特征。 BLOB分析功能: 1、…

磁盘分区机制

lsblk查看分区 Linux分区 挂载的经典案例 1. 虚拟机增加磁盘 点击这里,看我的这篇文章操作 添加之后,需要重启系统,不重启在系统里看不到新硬盘哦 出来了,但还没有分区 2. 分区 还没有格式化 3. 格式化磁盘 4. 挂载 5. 卸载…

【Linux系统编程】环境变量详解

文章目录 1. 环境变量的基本概念2. 如何理解呢?(测试PATH)2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …

Elasticsearch8 集群搭建(二)配置篇:(1)节点和集群配置

安装完Elasticsearch后,需要对其进行配置,包括以下几部分:节点和集群配置、系统配置、安全配置。 此篇记录节点和集群配置的内容,后续将更新系统配置和安全配置。 节点和集群配置: 通过编辑/usr/local/elasticsearc…

2024最新版Python3.12.1的新特性

2024最新版Python3.12.1的新特性 New Features followed by the latest version - Python 3.12.1 in 2024 By JacksonML Python 3.12.1最新版已经于2023年12月3日在python.org正式发布! 详细信息可见官网链接:https://www.python.org 作为2024年的最新…

新发现个上头的神仙写简历工具,分分钟惊掉你下巴!

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…

SpringMVC第一天

简介 SpringMVC技术与Servlet技术功能等同&#xff0c;均属于web层开发技术 SpringMVC是一种基于java实现的MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 入门案例 第一步、导入SpringMVC与Servlet坐标 <?xml version"1.0" encod…

flink内存管理(二):MemorySegment的设计与实现:(1)架构、(2)管理堆内/外内存、(3)写入/读取内存、(4)垃圾清理器

文章目录 一. MemorySegment架构概览二. MemorySegment详解1.基于MemorySegment管理堆内存2.基于MemorySegment管理堆外内存3.基于Unsafe管理MemorySegment4.写入和读取内存数据5.创建MemoryCleaner垃圾清理器 在flink内存管理&#xff08;一&#xff09;中我们已经知道&#x…

四.Winform使用Webview2加载本地HTML页面并互相通信

Winform使用Webview2加载本地HTML页面并互相通信 往期目录本节目标核心代码实现HTML代码实现的窗体Demo2代码效果图 往期目录 往期相关文章目录 专栏目录 本节目标 实现刷新按钮点击 C# winform按钮可以调用C# winform代码显示到html上点击HTML按钮可以调用C# winform代码更…

Python schedule任务调度及其用法

如果需要执行更复杂的任务调度&#xff0c;则可使用 Python 提供的 sched 模块。该模块提供了 sched.scheduler 类&#xff0c;该类代表一个任务调度器。 sched.scheduler(timefunctime.monotonic, delayfunctime.sleep) 构造器支持两个参数&#xff1a; timefunc&#xff1a…

思迅商旗-loaddata-信息泄露-未公开Day漏洞复现

0x01阅读须知 本文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考。本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果,作者不承担任何法律责任&#…