JVM虚拟机初步了解

news2024/12/23 9:50:56

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展,在这个系列专栏中记录了博主在学习期间总结的大块知识点;以及日常工作中遇到的各种技术点 ┗|`O′|┛

🌆 题目速览

  • 1. JVM的位置
  • 2. JVM的体系结构
  • 3. 类加载器
    • 3.1 双亲委派机制
    • 3.2 沙箱安全机制
  • 4. 运行时数据区
    • 4.1 方法区
    • 4.2 栈
    • 4.3 本地方法栈(native关键字)
    • 4.4 堆
      • 4.4.1 三个堆内存
      • 4.4.2 堆内存调优参数
      • 4.4.3 垃圾回收算法
        • 4.4.3.1 GC算法——引用计数法
        • 4.4.3.2 GC算法——复制算法
        • 4.4.3.3 GC算法——标记清除算法
        • 4.4.3.4 GC算法——标记压缩算法
    • 4.5 程序计数器
  • 5. 栈、堆、方法区的调用关系

1. JVM的位置

  JVM相当于一种用于运行java程序的虚拟机软件,所有的java程序需要使用JVM才能运行;而JVM需要运行在操作系统上,操作系统也相当于是一种系统软件;操作系统也需要运行在硬件体系之上
在这里插入图片描述
jdk、jre、jvm的关系
在这里插入图片描述

2. JVM的体系结构

  一个java程序从开发到运行的全过程:程序员编写.java文件(源代码文件) 计算机使用javac.exe程序将.java文件编译成.class文件(字节码文件) 计算机使用java.exe程序将.class文件送到JVM中运行 运行的过程中随时向核心类库中调用Java编写好的程序来支撑自己编写程序的运行
  JVM虚拟机包含类加载器、运行时数据区以及执行引擎;运行时数据区有包含方法区、栈、本地方法栈、堆、程序计数器
  其中栈、本地方法栈、程序计数器在JVM运行的时候都不会产生垃圾,而所谓的JVM调优基本上都是在方法区和栈中进行调整
在这里插入图片描述

3. 类加载器

  使用new实例化的对象都存储在堆内存中,变量存储在栈内存中,将实例化后的对象赋值给变量的操作实际上就是将堆内存中的地址引用指向栈中的变量
  三大类加载器:
1、引导类加载器(BootstrapClassloader):用C++编写,是JVM自带的类加载器;负责加载Java的核心类库。(该加载器无法直接获取)
2、扩展类加载器(ExtClassloader):负责加载/jre/lib/ext目录下的jar包。
3、应用程序类加载器(AppClassloader):负责加载java -classpath或-D java.class.path所指的目录下的类与jar包。(最常用的加载器)
在这里插入图片描述

3.1 双亲委派机制

  类加载器接收到一个加载请求时,他会委派给他的父加载器,实际上是去他父加载器的缓存中去查找是否有该类,如果有就加载返回,如果没有则继续委派给父类加载,直到顶层类加载器。如果顶层类加载器也没有加载该类,则会依次向下查找子加载器的加载路径,如果有就加载返回,如果都没有,则会抛出ClassNotFoundException异常。
  使用双亲委派机制的好处:避免了类的重复加载,避免核心类库被修改导致的各种异常以及安全问题
在这里插入图片描述

3.2 沙箱安全机制

  沙箱安全机制实际上就是为了保证java程序的安全性而采取的一种机制措施,主要可以参考链接博客https://blog.csdn.net/IAMZTDSF/article/details/123869863

4. 运行时数据区

  运行时数据区包括:方法区、栈、本地方法栈、堆、程序计数器

4.1 方法区

  Method Area方法区(此区域属于共享区间,所有定义的方法的信息都保存在该区域)。方法区是被所有线程共享,所有字段、方法字节码、以及一些特殊方法(如构造函数,接口代码)也在此定义。

  存放内容:静态变量、常量、类、接口的定义、运行时常量池

  运行时常量池用于存放编译期生成的各种字面量符号引用,这些内容(引用)编译时期存储在class文件的常量池中,在类加载后存放到方法区的运行时常量池当中。

1、字面量
  int i = 1;  把整数1赋值给int型变量i,整数1就是Java字面量,
  String s = “abc”; abc也是字面量。
  
2、符号的引用
  符号引用就是使用一组符号来描述所引用的目标,符号可以是任何形式的字面量, 只要使用时能够无歧义的定位到目标即可。例如, 在Java中一个Java类将会编译成一个class文件,在编译时Java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类, 在编译时People类并不知道Language类的实际内存地址, 因此只能使用符号org.simple.Language来表示Language类的地址.

4.2 栈

  栈:先进后出(类似弹夹);队列:先进先出(类似排队先到先得),队列特性FIFO(first input first output)

  栈又叫作栈内存,主管程序的运行,生命周期和线程同步;线程结束栈内存也就释放了,所以对于栈来说,不存在垃圾回收问题。(main方法所在的线程叫做主线程,执行程序的时候main方法最先加载,但是最后结束,main方法执行结束之后主线程也就结束,此时栈内存随之释放)

  存放内容:八种基本数据类型、对象的引用,局部变量

  栈中存储的是对象的引用,对象本身并不存放在栈中,而是存放在堆(new出来的对象)或者常量池中(字符串常量对象存放的常量池中) 常量池在方法区
  方法中的局部变量使用final修饰后,放在堆中,而不是栈中

栈帧
  一条线程中的每一个执行或者等待执行的方法在栈中又叫作栈帧,每一个正在执行的方法总是在栈的最上方,方法执行后会被弹栈,通过父帧的指向执行下一个方法,等栈中的所有方法都执行完,也就意味着栈中已经没有栈帧,此时这个栈内存就会被释放。如果栈中被压进了过多的栈帧,就会导致栈满,程序就会出现栈溢出错误StackOverflowError在这里插入图片描述

4.3 本地方法栈(native关键字)

  native关键字的使用说明Java的作用范围已经达不到了,它会去调用底层的C语言库

  调用native关键字修饰的方法时,先进入本地方法栈,然后调用本地方法接口,通过调用JNI接口实现对其他语言代码和代码库的使用。

  JNI的作用:扩展Java的使用,融合不同的语言为Java所用(最初是为了融合C、C++语言因为Java诞生的时候,C和C++非常火,想要立足,就有必要调用C、C++的程序)。所以Java在JVM内存区域专门开辟了一块标记区域–本地方法栈(Native Method Area Stack),用来登记native方法,在最终执行(执行引擎执行)的时候,通过JNI来加载本地方法库中的方法。

4.4 堆

  堆内存在一个JVM中只存在一个,且堆内存的大小是可调节的,我们可以通过调节堆内存的大小来进行JVM调优。

  存放内容:实例化对象、字符串常量池

4.4.1 三个堆内存

  堆内存又被分为新生代(伊甸园区+幸存区)、老年代、元空间;jdk1.8之前元空间又被称作是永久存储区。
在这里插入图片描述

4.4.2 堆内存调优参数

参数描述
-Xms堆内存初始大小,单位m、g
-Xmx(MaxHeapSize) 堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize非堆内存最大允许大小
-XX:NewSize(-Xns)年轻代内存初始大小
-XX:MaxNewSize(-Xmn)年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss堆栈内存大小

4.4.3 垃圾回收算法

4.4.3.1 GC算法——引用计数法

  每个对象都会分配一个计数器,用于计算该对象被引用的次数,等到执行GC垃圾清除的时候,将被引用次数不符合要求的当做垃圾进行清除。

4.4.3.2 GC算法——复制算法

  幸存区可分为from取和to区
  对象通过new实例化后存在伊甸园区中,当伊甸园区中的对象数量达到一个阈值的时候会触发一次轻GC,经过GC仍存在的对象进入幸存from区;所谓的复制算法就是把幸存from区的对象进行GC之后和幸存to区的对象进行交换,然后把名字也进行互换(保证幸存to区里永远没有对象),经过指定次数的GC之后依然存活的对象存入老年区,而这个次数可以使用-XX:MaxTenuringThreshold进行指定

**优点:**没有内存碎片
**缺点:**幸存to区永远没有对象,于是会导致内存空间得到浪费

4.4.3.3 GC算法——标记清除算法

  第一次扫描,对仍存活的对象进行标注;第二次扫描,对未标记的对象进行清除

**优点:**不需要额外的空间
**缺点:**两次扫描,浪费时间,产生内存碎片

4.4.3.4 GC算法——标记压缩算法

  第一次扫描,对仍存活的对象进行标注;第二次扫描,对未标记的对象进行清除;第三次扫描,进行压缩,把向一端移动防止内存碎片

4.5 程序计数器

  程序计数器:Program Counter Register。每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向像一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。

5. 栈、堆、方法区的调用关系

  创建对象内存分析,类的定义以及字符串常量池都在方法区中,使用new实例化的对象存在堆中,独享变量存在栈里,通过引用地址指向堆中的实例化对象,对象的字符串属性指向堆中的字符串常量池中
在这里插入图片描述

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

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

相关文章

python(ch2)

可变长编码和不可变长编码 可变长编码是指不同字符使用不同数量的字节进行编码。例如,UTF-8 编码中,ASCII 字符使用 1 个字节编码,而其他语言的字符使用 2 个或更多字节编码。 不可变长编码是指所有字符都使用相同数量的字节进行编码。例如…

【数据结构与算法】动态规划法解题20240227

动态规划法 一、什么是动态规划二、动态规划的解题步骤三、509. 斐波那契数1、动规五部曲: 四、70. 爬楼梯1、动规五部曲: 五、746. 使用最小花费爬楼梯1、动规五部曲: 一、什么是动态规划 动态规划,英文:Dynamic Pro…

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【Python_Zebra斑马打印机编程学习笔记(四)】ZPL的一些简单指令

ZPL的一些简单指令 ZPL的一些简单指令前言一、ZPL 介绍二、ZPL 语法解析1、标签开始、标签结束2、标签原点位置设置3、标签长度设置4、标签文本打印深度设置5、标签打印宽度设置6、标签方向设置7、标签元素定位8、标签绘制矩形9、标签输入字段10、标签设置字段字体、大小11、标…

【论文阅读-PRIVGUARD】Day3:1-2节

PRIVGUARD: Privacy Regulation Compliance Made Easier(PRIVGUARD:更轻松地遵守隐私规定) 摘要 持续遵守如GDPR和CCPA等隐私法规已经成为从小型创业公司到商业巨头的公司的一项昂贵负担。罪魁祸首是当今合规过程中对人工审核的严重依赖&…

Pytorch训练RCAN QAT超分模型

Pytorch训练RCAN QAT超分模型 版本信息测试步骤准备数据集创建容器生成文件列表创建文件列表的代码执行脚本,生成文件列表训练RCAN模型准备工作修改开源代码编写训练代码执行训练脚本可视化本文以RCAN超分模型为例,演示了QAT的训练过程,步骤如下: 先训练FP32模型再加载FP32训练…

壹[1],图像源

1,工具名称:图像源 2,参数说明 2.1,图像源 注: 本地图像,使用本地图片以及本地图像文件夹 相机,连接的相机 SDK,使用相机的SDK,而不是海康SDK 2.2,像素格式 注&…

Jeecg项目部署

说明:Jeecg是一款低代码开发平台,简单说是一款现成的项目,该项目集成了许多功能,我们可以在这个项目之上开发自己的业务代码。 本文介绍Jeecg项目的部署,包括后端jeecg-boot项目、前端vue3项目。前端项目在本地Window…

VScode连接远端服务器一直输入密码解决方法

文章目录 1 关闭远程连接2打开命令面板3 输入remote-ssh: kill vs code server on host… 1 关闭远程连接 2打开命令面板 3 输入remote-ssh: kill vs code server on host… remote-ssh: kill vs code server on host… 然后一路回车(选中出问题的主机),输一遍密码…

真正理解微软Windows程序运行机制——窗口机制(第一部分)

我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。…

【日常聊聊】Sora- 探索AI视频模型的无限可能

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 方向一:技术解析 方向二:应用场景 方向三:未来展望 方向四:伦理与创意 方向…

深入理解JS的执行上下文、词法作用域和闭包(下)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹正向飞行(带偏航角控制)并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹正向飞行(带偏航角控制)并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模…

vue3自定义实现悬浮固定按钮组件

目录 一、需求描述二、代码解读三、结果展示 一、需求描述 需要5个固定的悬浮圆,居于页面的右侧。鼠标悬浮在圆上面会显示对应的文字提示其中包含返回顶部悬浮圆,当页面滑至底部时出现,点击页面滑到顶部。点击按钮会给出弹窗 二、代码解读…

LCR 172. 统计目标成绩的出现次数

解题思路&#xff1a;二分查找 题解一 class Solution {public int countTarget(int[] scores, int target) {// 搜索右边界 rightint i 0, j scores.length - 1;while(i < j) {int m (i j) / 2;if(scores[m] < target) i m 1;else j m - 1;}int right i;// 若数…

UE5 C++ Gas开发 学习记录(一)

一个新坑,在TPS的空余时间学习 创建了自己,敌人的BaseCharacter和子类,创建了Gamemode,创建了Controller AuraCharacterBase.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include &…

H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素。 分辨…

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

开启数字内容创作的新时代

目录 技术解析 未来展望 技术解析 Sora是一款由OpenAI开发的先进AI视频模型&#xff0c;其技术架构基于深度学习和自然语言处理技术。该模型的核心算法原理包括使用深度神经网络进行视频内容的理解、生成和互动。 在技术架构方面&#xff0c;Sora采用了一种混合的神经网络结…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…