八股文-JVM

news2024/11/13 9:24:05

是什么?有什么用?谁发明的?什么时候发明的?

Java虚拟机,用来运行Java程序,有很多个版本的虚拟机,比如HotSpot,最开始是SUN公司开发人员,和Java一起发布,现在被Oracle收购了

计算机不能直接运行吗?为啥要中间多一层虚拟机?

计算机可以执行机器代码,很多编程语言也是编译成机器码,j交给计算机直接运行的,不过Java为了实现一次编写代码,可以跨平台执行,所以加了一层虚拟机,同时虚拟机也简化了我们的编码,比如自动内存管理、垃圾回收、编译优化(解释执行/即时编译)

特性

跨平台、安全、内存管理、性能优化(即时编译-JIT)、多线程支持

运⾏时数据区

方法区、堆、栈(Java方法栈、本地方法栈)、程序计数器、
在这里插入图片描述

类加载过程

类加载是指,把编译好的class文件加载到运行时数据区,需要经过以下过程:
1、加载:加载是指查找字节流,并且据此创建类的过程。加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。
2、链接:是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。链接还分验证、准备和解析三个阶段。其中,解析阶段为非必须的。分配内存、符号引用解析成为实际引用
3、初始化:类加载的最后一步是初始化,便是为标记为常量值的字段赋值,执行 < clinit > 方法,会加锁保证类的初始化仅会被执行一次,这个特性被用来实现单例的延迟初始化。

类加载器和双亲委派机制

启动类加载器(C++实现):启动类加载器负责加载最为基础、最为重要的类,比如存放在 JRE 的 lib 目录下 jar 包中的类(以及由虚拟机参数 -Xbootclasspath 指定的类)。

其他类加载器:都是 java.lang.ClassLoader 的子类,这些类加载器需要先由另一个类加载器,比如说启动类加载器,加载至 Java 虚拟机中,方能执行类加载。双亲委派模型。每当一个类加载器接收到加载请求时,它会先将请求转发给父类加载器。在父类加载器没有找到所请求的类的情况下,该类加载器才会尝试去加载。
扩展类加载器(extension class loader)和应用类加载器(application class loader),均由 Java 核心类库提供。

扩展类加载器的父类加载器是启动类加载器。它负责加载相对次要、但又通用的类,比如存放在 JRE 的 lib/ext 目录下 jar 包中的类(以及由系统变量 java.ext.dirs 指定的类)。

应用类加载器的父类加载器则是扩展类加载器。它负责加载应用程序路径下的类。(这里的应用程序路径,便是指虚拟机参数 -cp/-classpath、系统变量 java.class.path 或环境变量 CLASSPATH 所指定的路径。)默认情况下,应用程序中包含的类便是由应用类加载器加载的。
Java 9有略微调整。
自定义的类加载器:自己实现的类加载器,可以满足一些自定义需求,比如对代码进行加解密

为啥要有双亲委派机制

保证一个类只被加载一次:因为父类加载了,子类就无需加载了,这样只会被加载一次
保证核心类库的安全性:防止子加载器去篡改核心类库的加载,比如写给自定义加载器把一些工具类给改了
解耦:类似与网络分层,各自做好自己的职责就行

解释执行/即时编译

解释执行:即逐条将字节码翻译成机器码并执行;
即时编译(JIT):即将一个方法中包含的所有字节码编译成机器码后再执行。
前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。

理论上讲,即时编译后的 Java 程序的执行效率,是可能超过 C++ 程序的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。
在这里插入图片描述

JRE、JDK、JVM关系?

JVM:Java虚拟机,是一个可以执行 Java 字节码的虚拟计算机。
JRE:Java 运行时环境,是运行 Java 应用程序所需的最小环境。包括了 Java 虚拟机(JVM)、核心类库和支持文件。
JDK: Java 开发工具包,是用于开发 Java 应用程序的工具集合,包括了 Java 运行时环境(JRE)、Java 编译器(javac)、Java 虚拟机(JVM)和各种工具(如 javadoc、javap 等)。

关系
JDK 包含了 JRE 和开发工具。
JRE 包含了 JVM 和运行 Java 程序所需的类库。
总结
如果你需要开发 Java 程序,需要安装 JDK。
如果你只需要运行 Java 程序,安装 JRE 就足够了。
JVM 是 JRE 的核心部分,负责执行 Java 程序。

垃圾回收

内存有限,对运⾏时数据区中的数据进⾏管理和回收。垃圾收集器分为串行、并行、并发。回收机制不同,吞吐量和响应时间不同。比如回收时间,各个阶段采用单线程还是多线程
Serial、Parallel、CMS、G1、ZGC。核⼼的算法有 3 个:标记-清除、标记- 整理、复制

JVM调优

主要也是围绕吞吐量和响应时间,对应响应时间有要求的,那就尽量减少STW时间,反正就是通过一下工具看运行时,YGC和FGC次数,以及每次STW时间,通过不断调整和观测来设置一个合理的值
实际工作中一方面是调整JVM参数,另一方面是修改代码。
参数问题可能有以下一些情况:
1、堆内存设置太小,不满足程序的正常运行,比如一个线程调用一个方法可以会占用1M,内存,并发数为1000,堆内存设置500M的话,一下就满了,这个时候可能会出现频繁垃圾回收或者OOM
2、堆内存新生代和老年代比例不合理,大部分都是临时对象的程序,新生代可以调大。
3、还有一些参数可以指定STW最大时间,这时JVM会根据实际情况调整部分内存大小
4、更换垃圾回收器,参考:https://blog.csdn.net/2301_79437276/article/details/140291840

一次GC流程

堆分为新生代和老年代,新生代分为E区和S区(S0、S1)。
新对象放入E区,大对象也可能直接放入老年代,E区满了会进行Young GC,存活下来的对象放入S区,S区里面存活下来的对象会进行一次负责,在S0和S1之间每复制一次,对象存活的分代年龄+1,当达到15时放入老年代,老年代满了会进行Full GC

为啥是15呢?

因为分代年龄存储在对象头里面,采用4bit存储,最大值只支持15

参考

https://www.cnblogs.com/tomakemyself/p/14147989.html

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

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

相关文章

VirtualBox增加磁盘并给docker用

在VirtualBox新增磁盘 在虚拟机停止的情况下依次选择&#xff0c;然后创建新磁盘 虚拟机新磁盘创建分区、格式化、挂载分区 开机自动挂载新磁盘分区/dev/sdb1&#xff1a; nano /etc/fstab末尾添加一行&#xff1a; /dev/sdb1 /disk02 e…

leetcode41. 缺失的第一个正数,原地哈希表

leetcode41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xf…

基于JavaSwing实现的酒店管理系统

一、项目介绍 > 欢迎使用酒店管理系统&#xff01; > 这是一个基于Java Swing开发&#xff0c;用于管理酒店预订、房间、订单和用户信息的系统。 > 适用于JAVA初学者作为入门学习项目。 二、项目演示 三、基础依赖 技术/框架版本描述Java8编程语言MySQL8.0数据…

ATGM331C-5T杭州中科微全星座定位授时模块电气参数

ATGM331C-5T 系列模块通过 UART 作为主要输出通道&#xff0c;按照 NMEA0183 的协议格式输出。 产品选型&#xff1a; 性能指标&#xff1a; 出色的定位导航功能&#xff0c;支持 BDS/GPS 卫星导航系统的单系统授时&#xff0c;以及任意组合的多系统联合定位&#xff0c;并支持…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…

倍增练习(1)

A - ST 表 && RMQ 问题 题目思路:st表的板子题用于静态区间求最值,通过倍增的思想,先通过预处理将各个区间的最大值通过转移式求出f[i][j] max(f[i][j - 1], f[i (1 << (j - 1))][j - 1]);然后再进行重叠查询查询,k log2(r - l 1);,max(f[l][k], f[r - (1 &l…

js中两种异步方式:async+await以及then

第一种方式 第二种方式 完整代码 前端代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>pywebv…

金手指设计

"MCP6294"。是一个轨到轨, 带宽为 10MHz 的 低功耗放大器. 对LM358测量 10MHz 范围内的频率特性&#xff0c;在 8MHz 左右&#xff0c;输出相移超过了 180。MCP6294的频率特性&#xff0c;则显示在 10MHz 运放相移之后 100左右。 对比两个运放的频率特性&#xff…

LLM - 理解 多模态大语言模型(MLLM) 的 预训练(Pre-training) 与相关技术 (三)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142167709 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

深入 mysql,掌握一对一、一对多、多对多表设计、查询及级联操作

数据库表的基本概念与关系 数据库通常包含多个表&#xff0c;每个表存储特定类型的信息。例如&#xff1a; 学生表&#xff1a;存储学生信息。老师表&#xff1a;存储老师信息。班级表&#xff1a;存储班级信息。 这些表通过各种关系连接&#xff0c;形成一个结构化的数据管…

vscode关闭git的提交提示

问题描述&#xff1a; vscode中光标停留在每一行都会有出现git仓库的提交信息&#xff0c;影响代码阅读。 解决方法&#xff1a; 左下角设置齿轮&#xff1a; 输入关键词commit input 取消勾选&#xff0c;即可解决。

判断n是否为两素数相乘

要求 请编写函数fun&#xff0c;其功能是:验证参数n是否可以分解成2个素数相乘&#xff0c;是则返回1&#xff0c;否则返回0&#xff0c;并通过指针变更x、y返回分解后的2个素数值&#xff0c;要求*x<*y。主程序中将打印出分解结果。 例如:1113*37&#xff0c;当函数fun的参…

Web APIs 第二天

第二天&#xff1a;DOM事件基础&#xff0c;注册事件&#xff0c;tab栏切换 添加事件监听 <body><button>点击</button><script>const btn document.querySelector(button)btn.addEventListener(click, function () {alert(嗲你)})</script> …

数据结构-3.3.栈的链式存储实现

一.链栈的定义&#xff1a; 二.总结&#xff1a;

Net8 调用BarTender2022 R8

先上效果图 官方只能支持.net framework&#xff0c;不支持.netCore 参考链接 https://support.seagullscientific.com/hc/en-us/community/posts/14770890037911-Support-for-NET-6 https://support.seagullscientific.com/hc/en-us/community/posts/360046932953-Make-SDK…

Web开发:ABP框架2——入门级别的增删改查Demo

目录 一、前言 二、上节回顾 ​编辑 三、新建Dto和添加映射 1.新建dto 2.添加映射规则 四、新建WebApi控制器用EFcore进行增删改查 1.新建Webapi控制器接口 2.新建Webapi控制器实现 3.跑项目测试 五、WebApi控制器调用底层代码 1.webapi控制器&#xff08;高层代码&…

JZ2440开发板——S3C2440的存储控制器

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 课程中说的“内存控制器”&#xff0c;准确来说是“存储控制器”&#xff0c;其配套书籍写的也是“存储控制器”。 另外“Nor Flash控制器”&#xff0c;说的也是“存储控制器”&#xff0c;或者“存储控…

C++日期类,详细!!!

日期类的练习可以巩固提高之前所学习的知识&#xff0c;还可以完成关于的日期练习 下面是关于日期的对应oj题 KY111 日期差值 计算一年的第几天 累加天数 1.Date.h 头文件部分 看看我们要实现那些接口 1.获取对应月份的天数:GetMonthDay 2. < > …

pybind11 学习笔记

pybind11 学习笔记 0. 一个例子1. 官方文档1.1 Installing the Library1.1.1 Include as A Submodule1.1.2 Include with PyPI1.1.3 Include with Conda-forge 1.2 First Steps1.2.1 Separate Files1.2.2 PYBIND11_MODULE() 宏1.2.3 example.cpython-38-x86_64-linux-gnu.so 的…

轴承表面缺陷检测系统源码分享

轴承表面缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…