JVM的组成部分(类加载器、运行时数据区、执行引擎、本地库接口)

目录

JVM作用

JVM构成 

1.类加载器

类加载子系统:

类加载器的分类:

双亲委派机制:

2.运行时数据区

程序计数器

虚拟机栈

本地方法栈

方法区

3.执行引擎

4.本地库接口


JVM作用

jvm是将字节码文件加载到虚拟机中,再将字节码文件编译/解释成机器码。

管理运行时的数据存储和垃圾回收,现在的jvm还可以执行其他语言的字节码

JVM构成 

1.类加载器

将硬盘上的字节码文件加载到jvm上

类加载子系统:

类加载过程:

✔️加载

以二进制的形式加载字节码;

在内存中为类生成一个class对象,将静态存储转为动态存储。

✔️链接

1.验证:

  • 验证class文件的格式是否正确,class文件在文件开头有特定的文件标识(字节码文件都以CA FE BA BE 标识开头)。
  • 元数据验证:验证语法是否正确。

2.准备

  • 为类的静态属性分配内存,并设置默认初始值,例如:   

           public static int a = 10;   准备阶段后的值是0,而不是10,初始化阶段才为10;

注意:final修饰的static变量在编译时进行初始化。

3.解析

将静态文件中的指令符号引用  替换成 内存直接引用

✔️初始化

为类变量(静态变量)赋予正确的值

类加载器的分类:

类加载器:真正实现类加载的具体实现者

✔️JVM角度(宏观)

  • 引导类加载器(启动类加载器):不是用java语言实现的,c/c++ JVM底层实现
  • 其他所有类加载器:用java语言写的实现类,都继承java.lang.ClassLoader

 ✔️开发者角度(微观)

引导类加载器 :

java中系统提供的类,都是由启动类加载器加载,例如String

扩展类加载器 :

java语言编写的,由sun.misc.LauncherAppClassLoader实现,

派生于ClassLoader类

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

应用程序类加载器 :

java语言编写的,由sun.misc.LauncherAppClassLoader实现。

派生于ClassLoader类

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

自定义类加载器 :

例如我们自己写一个集成ClassLoader

再例如Tomcat这种容器,都会有自己加载类的加载器

双亲委派机制:

当加载一个类的时候,先让上一级的类加载去加载,直到找到引用类加载器;

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

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

如果都找不到就报异常。

public class ClassLoaderDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //类加载器为null,说明是引导类加载器加载的
        System.out.println(String.class.getClassLoader());

        //我们的类是由sun.misc.Launcher$AppClassLoader@18b4aac2,应用程序类加载的
        System.out.println(ClassLoaderDemo.class.getClassLoader());

        //sun.misc.Launcher$ExtClassLoader@1b6d3586 应用程序类是由扩展类加载的
        System.out.println(ClassLoaderDemo.class.getClassLoader().getParent());

        //扩展类加载器是由引导类加载器加载的
        System.out.println(ClassLoaderDemo.class.getClassLoader().getParent().getParent());

    }
}

 输出结果:

双亲委派机制测试:当创建一个自己的String类,调用其中的类变量,由于双亲委派机制,java核心类库会创建String对象,而不会使用我们自己创建的String的类,因此报错。

 双亲委派机制的优点

安全,避免改变java核心类。

如何打破双亲委派机制?

在 ClassLoader 类中涉及类加载的方法有两个,loadClass(String name), findClass(String name),这两个方法并没有被 final 修饰,也就表示其他子类可以,重写 findClass 方法。
我们可以通过自定义类加载重写方法打破双亲委派机制, 再例如 tomcat 等都有自己定义的类加载器。

2.运行时数据区

运行时数据区组成:

程序计数器

作用:用来存储下一条指令的地址,由执行引擎读取下一条指令。

特点:

是一个很小的内存空间,但是运行速度最快的存储区域;

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

  • 生命周期与线程一致;

  • 不会出现内存溢出(唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域),不会有垃圾回收。

虚拟机栈

栈是运行单位,管理方法(java自己写的方法)运行;

调用方法入栈,运行出栈;

栈是线程私有的,存在内存溢出可能,不存在垃圾回收;

一个线程就是一个栈;

一个方法入栈后,可以看做是一个栈帧。

访问速度仅次于程序计数器。

栈帧:

局部变量表:存储方法中定义的变量

操作数栈:表达式计算

方法返回地址:与返回值无关

本地方法栈

作用:管理本地方法的调用

本地方法是线程私有的,不会有垃圾回收,是用c语言写的,用native关键字修饰;

如果线程请求分配的栈容量超过本地方法栈允许的最大容量抛出StackOverflowError(内存溢出)。

常见的本地方法:

Object中:

hashCode() 内存地址

getClass()

clone()                               

notiy(),唤醒,wait(),otiyAll()

FileInputStrem中:

native int read()

Thread

native void start0()

存放程序中产生的对象

JVM管理的最大一块内存空间

大小可以调节

线程共享

会出现内存溢出,会进行垃圾回收

堆空间有区域划分,为什么要进行划分?

新生代:

伊甸园区:刚刚创建的对象存放在伊甸园区

幸存者0:伊甸园剩余的对象和幸存者1中的对象

幸存者1:幸存者1中的对象

老年代:

存放生命周期长的/非常大的对象

经历过15次回收后依然存活的对象,将放在老年代

为什么要分区:

可以根据不同对象的存活时间进行划分

生命较长的对象放在老年区,减少垃圾回收的频率和扫描次数

对象创建以及在内存分布过程:

1.新创建的对象放在伊甸园区

2.当垃圾回收时,将伊甸园存活的对象移入到幸存者0区

3.继续运行,再次创建的对象还是保存到伊甸园区

4.下一次垃圾回收到来时,将伊甸园区存活的对象和幸存者0区移入到幸存者1区,幸存者0区和幸存者1区保证有一个为空。

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

老年代:新生代比例=2:1

伊甸园和两个幸存者比例=8:1:1

堆空间的参数设置:官网:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html​​​​​​​

-XX:+PrintFlagsInitial 查看所有参数的默认初始值

-Xms:初始堆空间内存

-Xmx:最大堆空间内存

-Xmn:设置新生代的大小

-XX:MaxTenuringTreshold:设置新生代垃圾的最大年龄

-XX:+PrintGCDetails 输出详细的 GC 处理日志

垃圾回收名词:

Minor GC:主要回收新生代

Major GC:回收老年代

FULL GC:  整堆回收;老年代不足时,方法区空间不足时也会触发堆回收

方法区

主要存储加到jvm中的类的信息

是线程共享的,会出现内存溢出;

方法区包含了一个特殊的区域“运行时常量池”。

方法区垃圾回收,必须同时满足三个条件

1.该类的所有对象以及子类对象都不存在

2.加载该类的加载器不存在了

3.该类的class对象没有被其他地方引用

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

3.执行引擎

作用:将高级语言翻译为机器码,即负责将装在到虚拟机中的字节码 解释/编译为机器码。

 

解释器:当 Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。

JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。

前端编译:java-javac----->.class

后端编译:执行引擎----->机器码

解释执行:sql,css,html,js,python,解释器逐行进行解释执行

缺点:效率低,优点:省去编译时间

编译执行:将某段代码进行整体编译,然后执行编译后的结果      

优点:效率更高,缺点:耗时

java是解释执行+编译执行

4.本地库接口

1.本地方法:被native关键字修饰的,不是java语言实现,而是操作系统实现。

2.为什么使用:java环境与外界交互,因为上层的高级语言没有对底层硬件直接操作的权限,而是需要调用操作系统的接口进行调用。

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

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

相关文章

特征融合篇 | YOLOv8 引入长颈特征融合网络 Giraffe FPN

在本报告中,我们介绍了一种名为DAMO-YOLO的快速而准确的目标检测方法,其性能优于现有的YOLO系列。DAMO-YOLO是在YOLO的基础上通过引入一些新技术而扩展的,这些技术包括神经架构搜索(NAS)、高效的重参数化广义FPN(RepGFPN)、带有AlignedOTA标签分配的轻量级头部以及蒸馏增…

RV1103与FPGA通过MIPI CSI-2实现视频传输,实现网络推流

RV1103与FPGA通过MIPI CSI-2实现视频传输,实现网络推流。 一:图像格式 支持图像格式如下: [0]: NV16 (Y/CbCr 4:2:2) Size: Stepwise 64x64 - 2304x1296 with step 8/8 [1]: NV61 (Y/CrCb 4:2:2) Size: Stepwise 64x64 - 2304x1296 with …

POI及EasyExcel学习笔记

POI及EasyExcel学习笔记 组件、工具 POI-Excel概述 Apache POI 结构: HSSF - 提供读写[Microsoft Excel](https://baike.baidu.com/item/Microsoft Excel)格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF &am…

美团收银餐饮版培训教程

硬件连接方式及介绍: 双屏收银机 收银一体机 双屏收银机连接图 收银一体机连接图 前台打印机 后厨打印机 标签打印机 前台打印机连接图 后厨打印机连接图 其它收银机配件 软件前期设置 1、机器联网 点开桌面的设置,点击更多,点击以太网,最上…

Linux与windows互相传输文件之rzsz命令

文章目录 关于rzsz安装软件使用命令方法一:直接拖拽方法二:直接在终端输入rz 关于rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件 安装完毕之后可以通过拖拽的方式将文件上传过去 首先看一下我们的机器可以使用网络吗&#xff…

QT upd测试

QT upd测试 本次测试将服务器和客户端写在了一个工程下&#xff0c;代码如下 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QUdpSocket> #include<QTimer>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE…

C++的流库

1.流的概念 “流”&#xff0c;即“流动”的意思&#xff0c;是物质从一处向另一处流动的过程。在计算机这边通常是指对一种有序连续且具有方向性的数据的抽象描述。 C 中的流一般指两个过程的统一&#xff1a; 信息从外部输入设备&#xff08;键盘&#xff09;向计算机内部…

网页设计-用户体验

Use Cases (用例) 用例是用户如何在网站上执行任务的书面描述&#xff0c;从用户的角度描述了系统响应请求时的行为。每个用例都是用户实现目标的一系列简单的步骤。简言之&#xff0c;用例是一种用于描述系统如何满足用户需求的方法。 用例的好处 1. 明确需求&#xff1a; Use…

【测试入门】测试用例经典设计方法 —— 因果图法

01、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&#xff0c;尽量将它分解成若干个简单的部分。这样做的好处是&#xff0c;不必在一次处理过程中考虑所有的原因。没有固定的流程说明究竟分解到何种程度才算简单&#xff0c;需要测试…

Flutter 滚动布局:sliver模型

一、滚动布局 Flutter中可滚动布局基本都来自Sliver模型&#xff0c;原理和安卓传统UI的ListView、RecyclerView类似&#xff0c;滚动布局里面的每个子组件的样式往往是相同的&#xff0c;由于组件占用内存较大&#xff0c;所以在内存上我们可以缓存有限个组件&#xff0c;滚动…

每天五分钟计算机视觉:掌握迁移学习使用技巧

本文重点 随着深度学习的发展,迁移学习已成为一种流行的机器学习方法,它能够将预训练模型应用于各种任务,从而实现快速模型训练和优化。然而,要想充分利用迁移学习的优势,我们需要掌握一些关键技巧。本文将介绍这些技巧,帮助您更好地应用迁移学习技术。 迁移学习的关键…

HCIP-BGP选路实验

一.实验拓扑图 二.详细配置 R1 interface GigabitEthernet0/0/0 ip address 12.1.1.1 255.255.255.0interface LoopBack0 ip address 1.1.1.1 255.255.255.0interface LoopBack1 ip address 10.1.1.1 255.255.255.0bgp 1 router-id 1.1.1.1 peer 12.1.1.2 as-number 2ipv4-fa…

Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132534422 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; 官方文档&#xff1a;Unity官方Input System手册与API官方测试用例&#xff1a;Unity-Technologies/InputS…

c/c++公交管理系统(星穹轨道可视化EasyX)

注&#xff1a;全代码由博主个人耗时两个星期开发&#xff0c;实现了基础的公交管理系统功能&#xff1a;1.前端用户查询站点以及查看所有站点。2.后端管理员权限&#xff0c;实现登录系统检验&#xff0c;添加路线以及删除路线。最重要的是使用EasyX实现了星穹轨道的启动以及抽…

ROS2手册的离线编译安装

ROS开发中经常要查询相关API&#xff0c;把文档下载到本地离线使用方便快捷&#xff0c;极大提高开发效率 下载ROS2文档 git clone https://github.com/ros2/ros2_documentation.gitcd ros2_documentation安装sphinx pip install Sphinx配置sphinx sphinx-quickstart按提示…

快速上手的AI工具-文心辅助学习

前言 大家好晚上好&#xff0c;现在AI技术的发展&#xff0c;它已经渗透到我们生活的各个层面。对于普通人来说&#xff0c;理解并有效利用AI技术不仅能增强个人竞争力&#xff0c;还能在日常生活中带来便利。无论是提高工作效率&#xff0c;还是优化日常任务&#xff0c;AI工…

【Linux】vim的使用

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 目录 1. 前言2. vim的基本概念3. vim的基本操作4. vim正常模式命令集4.1 命令模式4.1.1 光标定位 4.2 插入模式4.3 底行模式 这个是在网上找的一张关于vim键盘的图 1. 前言 …

爬虫requests+综合练习详解

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用&#xff1a;模拟浏览器发请求 requests流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

Netty和Reactor设计模式

Netty Netty一个线程通过多路复用&#xff0c;能够实现多个socket的非阻塞的调用。 Reactor Reactor 模式是一种设计模式,也叫响应器模式。 以下是 Reactor 模式的基本组成部分&#xff1a; 事件处理器&#xff08;Event Handlers&#xff09;&#xff1a; 这些是实际处理特…

【深度学习目标检测】十七、基于深度学习的洋葱检测系统-含GUI和源码(python,yolov8)

使用AI实现洋葱检测对农业具有以下意义&#xff1a; 提高效率&#xff1a;AI技术可以快速、准确地检测出洋葱中的缺陷和问题&#xff0c;从而提高了检测效率&#xff0c;减少了人工检测的时间和人力成本。提高准确性&#xff1a;AI技术通过大量的数据学习和分析&#xff0c;能够…