1.什么是JVM?

Java虚拟机,Java具有自动内存管理等一系列特性,为实现Java跨平台,一次编译处处执行。

2.JVM结构图

3.类加载器-入口

加载class文件,将类信息存放到运行时数据区的方法区内存空间中

通过魔数和文件格式来判断是否是class文件

类生命周期或加载过程

3.1 类加载器分类

  • 启动类加载器(BootstrapClassLoader):由C++实现。

  • 扩展类加载器(ExtCla ssLoader/PlatformClassLoader):由Java实现,派生自ClassLoader类。

  • 应用程序类加载器(AppClassLoader):也叫系统类加载器。由Java实现,派生自ClassLoader类。

  • 自定义加载器 :程序员可以定制类的加载方式,派生自ClassLoader类。

3.2 双生委派机制

类加载器收到加载请求,不是自己尝试加载,请求委托父加载器,依次向上,自底向上避免重复加载,自顶向下进行加载,避免核心类被修改。

沙箱安全机制:包含核心类(启动类,扩展类加载器中的类不被破坏),防止内存中出现多份同样的字节码。

4. 运行时数据区

4.1 方法区/非堆

被所有线程锁共享{共享区间},类信息{接口、方法}+静态变量+常量+运行时常量池。

4.2 堆

存放指向类元数据的地址,JVM启动时创建,堆内存大小可以调节。

-Xms 512m 初始大小

-Xmx 512m 最大大小

非堆内存

# 设置元空间大小(JDK 8+ 替代永久代)
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# 设置线程栈大小
-Xss1m  # 每个线程栈大小为 1MB

4.2.1 分代

堆内存分为:新生代/老年代/永久代(在方法区,8之后变成元空间,只是逻辑上属于堆内存)

年轻代分为:伊甸园区,幸存者区

4.2.2 分代空间工作流程

频繁的垃圾回收成为Minor GC

1.生命周期短的对象,在新生代创建,在新生代被垃圾回收。

2.生命周期长的对象,在新生代创建,老年代回收

3.几乎所以对象创建在伊甸园区,大多销毁在新生代,大对象直接进入老年代

先创建在伊甸园区,满后触发垃圾回收器,回收不再被引用的对象,将剩余对象移动到幸存者0区,对象赋值年龄计数器为1。伊甸园区清空

再次满后,对伊甸园区和幸存者0区进行销毁不再被引用的对象,将剩余对象都移动到幸存者1区

对应对象的年龄计数器+1

依次类推,幸存者区0和1进行交替存放,对应对象年龄+1,年龄达到15晋升老年代

4.2.3 堆空间分配

新生代1/3堆空间,老年代2/3,新生代:8:1:1

老年代满后产生Major GC,触发Full GC 进行老年代垃圾回收。清理后仍然不能进行对象保存此时产生OOM异常

4.2.4 永久代

存放运行环境必须的类信息,fullgc触发回收,若出现OOM:PermGen,永久代设置内存不足被占满

Jdk 自身携带的class interface 等

jdk1.8 去永久代变元空间,元空间占用的是本地物理内存

4.2.5 内存溢出的时候:如何分析

内存溢出分析工具

MAT

eclipse推出的内存分析利器,支持解析hprof等格式的堆快照,能快速定位大对象、内存泄漏点,适合处理GB级快照文件

jvisualvm

通过OQL(对象查询语言)在堆快照中查询特定对象(如“所有未被回收的String对象”),精准定位内存问题。

arthas 阿尔萨斯 https://arthas.aliyun.com/doc/quick-start.html

JVM

启动 java -jar arthas-boot.jar

按 Java 进程前面的 序号,然后回车

会展示当前进程的信息 dashboard

查看静态的属性 getstatic

查看当前 JVM 的信息 jvm

查看内存使用状态 memory

常规命令

会打印线程 ID 的栈 thread ID

反编译类 jad

监控方法的返回值 watch

退出 quit、exit

4.2.6 垃圾回收算法

复制算法

堆内存分割两块,遍历from空间检索存活对象搬运到to空间,清理from空间,名称互换

实现简单,不存在内存碎片。内存缩小一半

标记清除

使用可达性分析算法,标记可达对象,清除未标记对象。

充分利用内存。经过两次扫描,产生内存碎片。

标记整理/标记压缩

在标记清除基础上进行压缩空间。

充分利用内存,不会产生内存空间。经过两次扫描耗费时间,存活对象对整理麻烦,算法效率降低

分代收集算法

三合一,年轻代复制算法,老年代标记混合实现。

4.2.7 判断一个对象是否可回收

引用计数法

可达性分析算法

4.3 栈

线程创建时创建,声明周期跟随线程,线程私有,线程上执行的每个方法都各自对应一个栈帧。

栈存储栈帧,栈帧是一个内存区块,包含方法执行的数据信息

4.3.1 局部变量表

存储方法参数和方法体内定义的局部变量:8种基本类型变量、对象引用变量、实例方法。

4.3.2 操作数栈

在方法执行过程中根据字节码指令记录当前操作的数据,将它们入栈或出栈。用于保存计算过程的中间结果,同时作为计算过程中变量的临时存储空间。

4.3.3 动态链接

可以知道当前帧执行的是哪个方法。指向运行时常量池中方法的符号引用。程序真正执行时,类加载到内存中后,符号引用会换成直接引用

4.3.4 方法返回地址

可以知道调用完当前方法后,上一层方法接着做什么,即“return”到什么位置去。存储当前方法调用完毕

4.3.5 栈溢出

StackOverflowError

出现情况:代码循环调用,栈空间不足 -Xss2M

垃圾回收不涉及栈内存。方法调用结束后自动弹出

方法内的局部变量线程安全吗?

当方法内局部变量没有逃离方法的作用范围时线程安全,因为一个线程对应一个栈,每调用一个方法就会新产生一个栈桢,都是线程私有的局部变量,当变量是static时则不安全,因为是线程共享的。

4.4 本地方法栈

存储本地方法地址

4.5 程序计数器

每个线程都有,线程私有,运行时的指针,存储指向下一条命令的地址

5.本地方法接口

本地方法存储了从Java代码中调用本地方法时所需的信息。线程私有。

5.1 本地方法

由native修饰,c/c++编写,通过Java编译器看不到

5.2 本地方法库

提供所有本地方法与接口的实现

6. 执行引擎-出口

负责解析命令,交给操作系统执行

6.1 解释器

Java字节码加载到内存中,解释器逐条解析和执行字节码指令转换对应平台的本地机器指令。无需等待编译,执行速度较慢。

6.2 即时编译器

为了提高执行速度,JVM还使用即时编译器。即时编译器将字节码动态地编译为本地机器码,以便直接在底层硬件上执行。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.09.20 leetcode刷题记录

# 前言 昨天发布了第一遍博客,感觉很好,趁着我现在还是很感兴趣就多发几遍,希望能坚持下去,在这里记录下自己学习成长的经历。 今天是周五,下周一就又要去实习啦,距离上一段实习刚结束一个月,之…

SQLite3 中列(变量)的特殊属性

在 SQLite3 中,列的特殊属性通常通过约束(Constraints)和数据类型修饰符来定义。这些属性可以在创建表时指定,用于限制数据的完整性或定义特殊行为。以下是 SQLite3 支持的主要特殊属性及其说明: 1. 主键约束&#xff…

Datawhale AI 夏令营:用户洞察挑战赛 Notebook(2)

针对文本聚类优化 优化TF-IDF特征工程# 调整ngram_range:设置为(1, 2),捕捉单字和双字词(如“不错”“不满意”)。 # 限制特征数量:通过max_features5000保留高信息密度特征,降低维度。 # 过滤低频/高频词&…

【博主亲测可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安装教程)

软件简介 Adobe Photoshop 2025是Adobe公司开发的一款图像处理软件。作为行业标准的数字图像编辑工具,其核心定位是创意设计、后期摄影、3D建模和AI驱动创作,适用于专业设计师、摄影师、插画家和多媒体创作者。界面设计简单直观,易于操作&…

unity A星寻路

算法 fCost gCost hCost gCost 是当前节点到移动起始点的消耗,hCost是当前节点到终点的消耗 网格为变成为1的矩形,左右相邻的两个网格直接的gCost为1,斜对角相邻的两个网格的gCost为1.4 hCost 当前网格到终点网格的 水平距离 垂直距离 比如…

十一 Javascript的按值传递

你将知道:“传递” 值是什么意思什么是按值传递传递物品JavaScript 中没有传递引用!介绍当需要在 JavaScript 中分配或简单地将一个值传递给其他标识符时,我们就会看到通常所说的 按值传递 。严格来说,JavaScript 中传递值的方式只…

SpringBoot ThreadLocal 全局动态变量设置

需求说明: 现有一个游戏后台管理系统,该系统可管理多个大区的数据,但是需要使用大区id实现数据隔离,并且提供了大区选择功能,先择大区后展示对应的数据。需要实现一下几点: 1.前端请求时,area_i…

如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题 摘要: 在使用 PyCharm 2025 控制台通过 pip install 安装第三方库时,常会遇到诸如 ModuleNotFoundError: No module name…

打破技术债困境:从“保持现状”到成为变革的推动者

相信许多在科技行业的同行都面临过类似的挑战:明知系统存在“技术债”,却因为沟通成本、团队压力和短期KPI等原因,难以推动改进,最终陷入“想做却不敢做”的矛盾心态。这不仅影响个人心情,更重要的是,它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述:RabbitMQ 是什么? 你可以把 RabbitMQ 想象成一个「快递中转站」。 比如你在网上买了一本书,卖家(生产者)把包裹(消息)交给快递站(RabbitMQ&…

Unity Demo-3DFarm详解-其一

我们来拆解一个种田游戏,这个游戏种类内部的功能还是比较模板化的,我们来一点点说。我们大体上分为这么几个部分:农场运营玩法角色与玩家互动物品与背包存档和进度管理用户界面系统农场运营可以大体上分为:种植系统:支…

esp8266驱动下载

问题描述:esp8266插上电脑,设备管理器无法识别,显示为USB serial(黄色感叹号) 首先确认你的esp8266是不是 CH340 系列的 USB 转串口芯片 CH340驱动下载地址

大语言模型的极限:知识、推理与创造力的边界探析

大语言模型的极限:知识、推理与创造力的边界探析 人工智能领域的快速发展推动了大语言模型(LLM)的广泛应用,这些模型在文本生成、知识问答和创意表达等方面展现出前所未有的能力。然而,随着应用场景的深化,…

git中的fork指令解释

在Git中,Fork 是指将他人的代码仓库(Repository)复制到自己的账户下,创建一个完全独立的副本[1][2]。以下是关于Fork的详细说明: Fork的定义与核心作用 定义:Fork是代码托管平台(如GitHub&#…

iPhone 抓包工具有哪些?多工具对比分析优缺点

iOS 平台一向以安全性著称,这也使得对其进行网络调试和抓包变得异常困难。相比安卓,iPhone 抓包难点主要在以下几点: 系统限制代理设置的灵活性无法自由安装根证书抓包常涉及 HTTPS 解密与双向认证破解普通用户设备无 root 或越狱权限 因此&a…

使用 libcu++ 库

文章目录使用 libcu 库安装与设置基本组件1. 原子操作2. 内存管理3. 类型特性4. 同步原语编译选项注意事项使用 libcu 库 libcu 是 NVIDIA 提供的 CUDA C 标准库实现,它为 CUDA 开发者提供了类似 C 标准库的功能和接口。以下是使用 libcu 的基本指南: …

[Leetcode] 预处理 | 多叉树bfs | 格雷编码 | static_cast | 矩阵对角线

魔术排列模拟一个特定的洗牌过程,并找到使得经过一系列洗牌和取牌操作后,能够与给定的目标数组target相匹配的最小k值核心思想: 预处理初始排列:从一个按顺序排列的数组(例如,{1, 2, 3, ..., n})开始。洗牌…

【技术追踪】SynPo:基于高质量负提示提升无训练少样本医学图像分割性能(MICCAI-2025)

SAM 新用法,无需训练,利用高质量负提示提升分割性能~ 论文:SynPo: Boosting Training-Free Few-Shot Medical Segmentation via High-Quality Negative Prompts 代码:https://liu-yufei.github.io/synpo-project-page/ 0、摘要 大…

深入理解机器学习

一.前言本章节开始来讲解一下机器学习的知识,本期作为一个了解就大概介绍一下,我们不会从机器学习基础开始介绍,但是后面会来补充,随着ai的不断发展,机器学习在ai的领域里面的占比越来约少,我们还是以应用为…

数据结构 顺序表(1)

目录 1.线性表 2.顺序表 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用 的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#…