当前位置: 首页 > article >正文

【Java八股】JVM

JVM

1. jvm内存区域分为哪些部分

线程私有的:程序计数器、虚拟机栈、本地方法栈

程序计数器:指示当前线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到正确的执行位置的关键

虚拟机栈:用于存储方法调用的数据,由一个个栈帧组成,每个栈帧表示一个方法调用,包括局部变量表、操作数栈、动态链接、方法返回地址。其中局部变量表用于存储基本数据类型的局部变量和对象的引用,操作数栈用于存储中间计算结果,动态链接用于存储方法的符号引用,用于将符号引用转换为调用方法的直接引用。

线程共享的:堆、方法区、直接内存

堆:最大的一块内存区域,唯一目的就是存储对象实例,几乎所以对象实例都在这里分配内存(除了JIT逃逸分析后在栈上分配内存的)。另外堆中还包括字符串常量池。

方法区:JDK1.8以前,方法区是用堆中的永久代实现的,也就是在堆中分配内存,JDK1.8以后方法区是用元空间实现的,也就是在本地内存中。方法区中包括类信息、静态变量、运行时常量池。

直接内存:

2. 堆内存分为哪三个部分,对象是如何在堆中晋升的

新生代内存(Eden区、S0区、S1区)

老生代

永久代(用于实现方法区)

对象首先在Eden区分配内存,年龄为0;

一次垃圾回收后,如果对象还存活,就让它的年龄+1,并将它放在S0或S1;

此后每次垃圾回收后,如果对象还存活,就让它的年龄+1;

如果它的年龄达到15岁,就晋升到老年代。

另外大对象会直接进入老年代,大对象就是需要大量连续内存空间的对象,例如字符串,数组。

3. 运行时常量池是什么

运行时常量池用于存储编译期生成的各种字面量和符号引用

4. Java类加载的过程

1)加载

由类加载器完成,使用哪个类加载器取决于双亲委派模型。这一步骤主要完成了三件事:

根据类名找到二进制字节流;

将二进制字节流的静态存储结构转为方法区中的动态存储结构;

在内存中生成一个代表该类的class对象;

2)验证

确保二进制字节流的信息符合JVM规范

3)准备

为类变量分配内存并设置初始值;

4)解析

将符号引用替换为直接引用。(符号引用相当于仅有名称,不指向具体内存地址,符号引用存储在运行时常量池中,转换为直接引用,即内存实际地址后,才能进行具体访问操作)

5)初始化

执行类的初始化方法,即cinit方法

5. Java对象的创建过程

1)类加载检查

先检查该对象对应的类有没有被加载过,如果没有,先进行类加载过程;

2)分配内存

为对象分配足够的内存,所需内存大小在类加载完成后就可以确定。

分配方式有两种:

第一,指针碰撞

适用于堆内存规整的情况(即没有内存碎片)。用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。

第二,空闲列表

虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块儿足够大的内存块儿来划分给对象实例,最后更新列表记录。(这种方式容易造成内存碎片)

3)初始化零值

将分配的内存区域都初始化为零

4)设置对象头

设置对象头信息,包括它属于哪个类、年龄是多少、哈希码是多少等信息。从这里可以看出来,对象的内存分为对象头、实例数据和对齐填充三部分。

5)执行init方法

6. 类加载器是什么,双亲委派模型是什么

类加载器是负责完成类加载的第一步:加载的。每个类都有一个classloader。

直白地说,类加载器就是负责将二进制字节码文件.class文件加载到JVM中,并生成一个class对象。

类加载时不会一次性加载所有的类,而是在用到该类的时候再动态地加载。

类加载器有三种:启动类加载器、扩展类加载器、应用程序类加载器。

启动类加载器是最顶层的加载类,用于加载JDK核心类库。

扩展类加载器用于加载jar包。

应用程序类加载器用于加载用户编写的类。

那么一个类到底由哪个类加载器去加载呢?这是由双亲委派模型指定的。

每个类加载器都有自己对应的父类加载器。

在classloader的loadClass方法中,双亲委派模型的执行流程如下:

1)首先检查该类是否被加载过,如果加载过,直接返回;

2)调用父类加载器的loadClass方法来加载类,这样根据类加载器的父子关系,所有请求最终会传递到顶层的启动类加载器;

3)当父类加载器反馈自己无法加载这个类时(即它没有搜索到这个类),子加载器就尝试自己加载;

4)如果子类加载器也无法加载这个类,就抛出异常;

为什么要使用双亲委派模型?

使用双亲委派模型是为了避免类的重复加载。如果不去调用父加载器的loadClass方法,而是每个类自己加载自己的话,那么如果两个类名字相同,就会出现类名相同但实际上不一样的两个类。

7. 死亡对象的判断方法

引用计数法

  • 每当有一个地方引用它,计数器就加 1;
  • 当引用失效,计数器就减 1;
  • 任何时候计数器为 0 的对象就是不可能再被使用的。

这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间循环引用的问题。

可达性分析法:

用一系列GC Root作为起点,构建对象的引用链。当进行可达性分析时,从GC Root开始向下搜索,走过的对象即有引用的对象。

而如果从GC Root无法到达对象,就认为此对象是不可用的,需要被回收。

8. 对象的引用类型有哪些

强引用:绝不会被垃圾回收,当JVM内存不足时,即使抛出OOM也不会回收

软引用:可有可无,JVM内存不足时可能会被回收,JVM内存足够就不会被回收

弱引用:只有弱引用的对象,被JVM发现了就会被回收,不管内存是否足够

虚引用:形同虚设,跟没有引用一样,随时可能被回收

9. 如何判断一个常量是废弃常量

假如在字符串常量池中存在字符串 “abc”,如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 “abc” 就是废弃常量,如果这时发生内存回收的话而且有必要的话,“abc” 就会被系统清理出常量池了。

10. 如何判断一个类是无用的类,从而发生类卸载?

类卸载即类的class对象被垃圾回收。

类卸载的条件是:

1)该类的所有实例对象都已经被回收;

2)该类没有在其他任何地方被引用;

3)该类的加载器已经被回收;

11. JVM垃圾回收算法有哪些

1)标记清除算法

标记出所有不需要回收的对象,然后统一回收掉所有没有被标记的。

缺点:效率不高;会产生内存碎片;

2)复制算法

每次仅使用内存区域的一半,这一半使用完后将还存活的对象复制到另一半去,然后将这一半的全部空间清理掉。

缺点:可用内存空间变成了原来的一半,如果对象很大,复制会耗费大量时间。

3)标记整理算法

将存活的对象向一端移动,然后直接清理掉边界以外的全部内存。

缺点:因为要整理,效率也不高,适合老年代这种垃圾回收频率不是很高的场景。

4)分代收集算法

当前虚拟机的垃圾收集都采用分代收集算法,即根据新生代、老年代等分代,选择不同的垃圾收集算法。对于新生代,GC频率比较高、对象占用内存也不是很多的情况,可以选择复制算法。对于老年代,存活几率比较高,可以选择标记清除或者标记整理算法。

实际上JVM之所以对对象进行分代,也是为了垃圾回收时能够根据不同代对象的特点选择合适的算法。

12. 垃圾回收器有哪些

1)Serial串行收集器

历史最悠久的,单线程的,新生代标记复制算法,老生代标记整理算法

2)Serial Old

Serial收集器的老年代版本

3)并行收集器ParNew

其实就是Serial的多线程版本,仍然是新生代标记复制算法,老生代标记整理算法

4)Parallel Scavenge

JDK1.8采用的收集器。同样新生代标记复制算法,老生代标记整理算法,且为多线程。但提供了很多参数帮助用户实现最大吞吐量

5)Parallel Old

Parallel Scavenge的老年代版本

6)CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。

7)G1收集器

G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征。

12. JVM常用的参数有哪些

指定堆内存大小:-Xms用于指定最小堆内存大小,-Xmx用于指定最大堆内存大小

指定新生代内存:-XX:NewSize最小新生代内存, -XX:MaxNewSize最大新生代内存,-Xmn直接指定新生代内存大小,另外还可以通过-XX:NewRation指定新生代老生代内存比例

指定元空间大小:-XX:MetaspaceSize、-XX:MaxMetaspaceSize

选择垃圾回收器:-XX:+UseSerialGC选择串行收集器、-XX:+UseParallelGC选择并行收集器、-XX:+UseConcMarkSweepGC选择CMS收集器、-XX:+UseG1GC选择G1收集器

还有一些打印日志的参数:

-XX:+PrintGCDetails 打印GC信息

-XX:+PrintGCDateStamps 打印GC信息

-XX:+PrintTenuringDistribution # 打印对象分布

-XX:+PrintHeapAtGC # 打印堆数据

相关文章:

【Java八股】JVM

JVM 1. jvm内存区域分为哪些部分 线程私有的:程序计数器、虚拟机栈、本地方法栈 程序计数器:指示当前线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈:用于存储方法调用的数据&…...

Citespace之关键词爆发检测分析(进阶分析)

在开始citespace进行关键词爆发检测分析之前,如果不会使用citespace的,可以参考我之前这一篇博客: https://blog.csdn.net/m0_56184997/article/details/145536095?spm1001.2014.3001.5501 一、创建工程后进行设置 在创建好工程后&#xf…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

一周发生AI事件总结(02.08)

本周人工智能领域发生的所有事件: Ilya Sutskever的初创公司正洽谈以约200亿美元估值进行融资:据路透社报道,由前OpenAI首席科学家Ilya Sutskever创立的人工智能初创公司Safe Superintelligence正洽谈以“至少”200亿美元的估值进行融资。该…...

NIO——网络编程

文章目录 非阻塞 vs 阻塞阻塞非阻塞多路复用 Selector好处创建绑定 Channel 事件监听 Channel 事件select 何时不阻塞 💡处理 accept 事件事件发生后能否不处理💡 处理 read 事件为何要 iter.remove()💡cancel 的作用💡不处理边界…...

IDEA关联Tomcat,部署JavaWeb项目

将IDEA与Tomcat关联 创建JavaWeb项目 创建Demo项目 将Tomcat作为依赖引入到Demo中 添加 Web Application 编写前端和后端代码 配置Tomcat server,并运行...

12. k8s二进制集群之kubelet部署

什么是kubelet准备事项创建kubelet-bootstrap.kubeconfig文件创建kubelet配置文件创建kubelet服务配置文件(将kubelet配置成系统服务)分发CA证书及Kubelet-bootstrap.kubeconfig到所有工作节点最后启动工作节点的kubelet服务总结什么是kubelet Kubelet 是 Kubernetes 的核心…...

【5】阿里面试题整理

[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...

android的DataBinding的使用

参考: Android基础入门:dataBinding的简单使用 Android DataBinding的使用...

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析

引言 2025年2月6日,OpenAI宣布ChatGPT搜索功能向所有用户免费开放,且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响,有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…...

从0开始掌握Java开发框架:学习路线与系统指南

目录 1. Java 开发框架的分类1. Web 开发框架2. 持久层框架3. 依赖注入框架4. 微服务框架5. 测试框架 2. 主要框架的作用及关系(1)Spring Framework(2)Spring MVC(3)Spring Boot(4)M…...

边缘计算网关驱动智慧煤矿智能升级——实时预警、低延时决策与数字孪生护航矿山安全高效运营

迈向智能化煤矿管理新时代 工业物联网和边缘计算技术的迅猛发展,煤矿安全生产与高效运营正迎来全新变革。传统煤矿监控模式由于现场环境复杂、数据采集和传输延时较高,已难以满足当下高标准的安全管理要求。为此,借助边缘计算网关的实时数据…...

每日一题--数组中只出现一次的两个数字

数组中只出现一次的两个数字 题目描述数据范围提示 示例示例1示例2 题解解题思路位运算方法步骤: 代码实现代码解析时间与空间复杂度按位与操作获取最小位1的原理为什么选择最低有效的 1 位而不是其他位? 题目描述 一个整型数组里除了两个数字只出现一次…...

React Hooks 与 Class 组件相比有何优势

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

浏览器的缓存方式几种

浏览器的缓存方式主要分为以下几种: 1. 强制缓存(强缓存 / Memory Cache & Disk Cache) 通过 Expires 或 Cache-Control 头部控制。在缓存有效期内,浏览器直接使用缓存,不发起请求。 关键HTTP头: Ex…...

新装windows系统配置

安装windows 将windows镜像iso工具刻录到u盘里。开机选择u盘启动&安装激活。Win10专业版用户请在命令提示符窗口中依次输入:slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GXslmgr /skms kms.03k.orgslmgr /ato系统安装完成后,可以到https://www.microsof…...

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台,提供 Gymnasium(OpenAI Gym) 接口,主要用于强化学习(Reinforcement Learning, RL)、多智能体竞速(Multi-Ag…...

活动预告 |【Part1】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动,了解 Azure 如何为将工作负…...

可视化大屏的热力图,显示热点事件最直观。

可视化大屏的热力图在显示热点事件方面之所以直观,主要有以下原因: 视觉呈现特点 颜色直观表意:热力图通过不同的颜色来表示数据的密度或强度。通常情况下,红色等暖色调表示高密度或高热度区域,代表热点事件发生较为…...

认识Electron 开启新的探索世界一

一、Electron轻松入门 1.搭建开发环境: 一般情况下开发者会使用node.js来创建electron项目,node.js是一个基于Chrome V8引擎的javascript运行环境,所以首先需要到官网去下载安装node.js 下载链接:https://nodejs.org/enhttps://no…...

每日一题洛谷P5733 【深基6.例1】自动修正c++

#include<iostream> #include<string> using namespace std; int main() {string t;cin >> t;for (int i 0; i < t.length(); i){if (t[i] > a && t[i] < z){t[i] A - a;}cout << t[i];}return 0; }...

鸿蒙音视频播放器:libwlmedia

libwlmedia 跨平台播放器wlmedia现在已经支持了鸿蒙(Harmony)平台了&#xff0c;SDK插件地址&#xff1a;libwlmedia 一、接入SDK 1.1 导入SDK ohpm i ywl5320/libwlmedia1.2 添加权限&#xff08;可选&#xff09; 如果需要播放网络视频&#xff0c;需要添加网络权限 #m…...

CF998A Balloons​ 构造 ​

Balloons 算法&#xff1a;构造 rating : 1000 思路&#xff1a; 分情况讨论&#xff1a; 1. 当只有一个气球包时&#xff0c;肯定不行 2.当有两个气球包时&#xff0c;若两个气球包的气球个数相同则不行 3.其余的情况都是可以的&#xff0c;题目问给格里高利的气球包数…...

分组加密算法CLEFIA

目录 (1)加密算法 轮函数 F函数 线性变换 (2)解密算法 (3)密钥扩展算法 分组加密算法CLEFIA CLEFIA分组密码算法由日本Sony(索尼)公司设计开发,接口对应于128比特分组密码技术例如ISO/IEC18033-3国际标准和高级加密标准(AES)。算法的分组长度是128比特,密钥长度…...

3.3 VO-O(算子)语法

VO-O语法部分是VO语言的特色部分。其核心概念主要有两个&#xff0c;“算子”以及“数据连接”。使用者通过拖拽“算子”图元、配置“算子”参数、构建“算子”间的“数据连接”&#xff0c;最终形成一个具有数据流转关系的流程图。该流程图可被理解为是由VO语言编写的一段程序…...

C++模板学习从专家到入门:关键字typename与class

文章目录 共同点typename特性class特性 共同点 在定义类模板或者函数模板时&#xff0c;typename 和 class 关键字都可以用于指定模板参数中的类型。 template <class T> template <typename T>typename特性 C 允许在类内定义类型别名&#xff0c;且其使用方法与…...

网络安全--边界安全

现在人们生活依赖互联网程度越来越高&#xff0c;网络安全也逐步进入人们日常视野&#xff0c;信用卡信息泄漏、开房记录被查询、商业机密泄漏等等&#xff1b;无不牵动着一个人、一个公司、甚至一个国家的神经。随着技术的发展&#xff0c;网络边界变得也越来越复杂&#xff0…...

2.攻防世界 backup

题目描述中提示&#xff0c;备份文件 进入题目页面如下 通用备份文件后缀名 .bak&#xff1a;这是最常见的备份文件后缀名之一&#xff0c;表示某个文件的备份版本。 .old&#xff1a;表示文件的旧版本或备份&#xff0c;通常用于系统更新时保存旧文件。 .backup&#xff1a;…...

如何在Windows上使用Docker

引言 WSL2&#xff08;Windows Subsystem for Linux2&#xff09;是微软开发的一种技术&#xff0c;允许在 Windows 操作系统上运行 Linux 环境。它提供了一个兼容层&#xff0c;使得用户可以在 Windows 系统中直接运行 Linux 命令行工具、应用程序和开发工具&#xff0c;而无需…...

气体控制器联动风机,检测到环境出现异常时自动打开风机进行排风;

一、功能&#xff1a;检测到环境出现异常时自动打开风机进行排风&#xff1b; 二、设备&#xff1a; 1.气体控制器主机&#xff1a;温湿度&#xff0c;TVOC等探头的主机&#xff0c;可上报数据&#xff0c;探头监测到异常时&#xff0c;主机会监测到异常可联动风机或声光报警…...