JVM(上)
目录
一、JVM概述
一、JVM作用
二、JVM整体组成部分
二、JVM结构-类加载
一、类加载子系统概述
二、类加载过程
1.加载
2.链接
3.初始化(类加载过程中的初始化)
三、类加载器分类
大致分两类:
细致分类:
四、双亲委派机制
五、打破双亲委派机制
三、JVM运行时数据区
一、运行时数据区组成概述
二、程序计数器
特点:
三、Java虚拟机栈
1、特点:
2、栈帧构成:
四、本地方法栈
1、作用:
2、特点:
五、Java堆内存
1、特点:
2、堆内存区域划分:
3、分区原因:
4、对象创建内存分配过程
5、堆空间的参数设置
6、方法区
一、JVM概述
一、JVM作用
JVM负责把字节码文件(.class)加载到虚拟机中,再把字节码文件解释/编译为机器码,管理运算时数据存储,垃圾回收。现在JVM还可以执行其他语言编译后的字节码文件。
二、JVM整体组成部分
1.类加载器:从硬盘上加载字节码文件到JVM中。
2.运行时数据区:按照不同的数据类型进行分区存储(方法区、堆、栈(用于放自己的方法)、本地方法栈(调用本地方法),程序计数器(用于线程切换,记录程序运行到那行))。
3.执行引擎:将字节码再次编译/解释成机器码 。
4.本地方法接口:调用本地操作系统方法接口。
其大致操作流程如下所示:
二、JVM结构-类加载
一、类加载子系统概述
从硬盘上加载字节码文件到JVM中。
二、类加载过程
1.加载
以二进制字节流方式加载字节码。(通过类名/地址获取类的二进制字节流)
在内存中为类生成一个class类对象,将静态存储转为运行时存储。(从硬盘到内存,用来生成class对象方法)
2.链接
1.验证:验证字节码格式是否正确,语法是否正确。
2.准备:为类的静态属性分配内存,并设初值。(但注意final static常量是在编译时设的初值)
3.解析 :静态文件中符号(指令符号)引用替换成内存中直接引用。(符号引用是 Class 文件的逻辑符号,直接引用指向的方法区中某一个地址)
3.初始化(类加载过程中的初始化)
对类变量(静态变量进行赋值)
类被初始化的时间有:使用类中静态变量,静态方法,运用main方法,创建对象,使用反射加载一个类,初始化类的子类优先加载父类。
注意:当只使用类中静态常量时,类不会被初始化,因为在编译阶段就初始化了,当类在加载阶段初始化完成,才说明类的整个加载过程结果。
三、类加载器分类
真正实施类加载的具体实现者(事务)
大致分两类:
1.引导类加载器
2.其他所有类加载器
细致分类:
1 、引导类加载器(启动类加载器 BootStrap ClassLoader)
用 C/C++语言实现,嵌套在 JVM 内部。
Java中系统提供的类,都是由启动类加载器加载.例如:String。
只存放在JAVA_HOME>\lib 目录。
2 、扩展类加载器(Extension ClassLoader)
由 java 语言实现,独立存在于虚拟机外部。
由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。
jre/lib/ext子目录(扩展目录)下加载类库。
3、 应用程序类加载器(系统类加载器 Application ClassLoader)
由 java 语言实现,独立存在于虚拟机外部。
由 sun.misc.Launcher$ExtClassLoader 实现.。派生于 ClassLoader 类。
加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类。
4、自定义类加载器
例如:我们自己写一个类继承ClassLoader。
例如:TomCat这种容器都会有自己加载类的加载器。
四、双亲委派机制
当加载一个类时,先让上一级的类加载器去加载;
直到找到引用类加载器;
如果上级类加载器找到了,就要上级类加载器的类;
如果上级找不到,就逐级向下委托,使用子类加载器的类;
如果找不到报异常。
优点:安全,避免自己编写的类替换 Java的核心类,如 java.lang.String.
五、打破双亲委派机制
通过自定义类加载器,重写ClassLoader类中的findClass();从而打破双亲委派机制。
三、JVM运行时数据区
一、运行时数据区组成概述
按照不同的数据类型进行分区存储,分为五部分:程序计数器,虚拟机栈,本地方法栈,堆,方法区。
二、程序计数器
用来记录程序执行指令地址。
特点:
内存小,速度快 ;
线程私有(每个线程都有自己的程序计数器);
生命周期同线程一致;
不会出现内存溢出(JVM中唯一区域);
不会有垃圾回收。
三、Java虚拟机栈
管理(Java自己写的)方法运行,调用方法入栈,运行完成出栈。
栈是运行时单位,一个方法入栈后可以看作一个栈帧,一个栈帧表示一个方法。
1、特点:
栈是线程私有的,内存可能溢出,不会有垃圾回收,快速存储访问方式(仅慢于程序计数器)。
2、栈帧构成:
局部变量表:存储方法中定义的变量,参数;
操作数栈:所有计算都借助操作数栈完成;
方法返回地址:记录被调用方法位置(从哪里来,回哪里去);
还有动态链接和一些附加信息。
四、本地方法栈
1、作用:
用于管理本地方法的调用。
本地方法就是系统库提供方法,用native关键字修饰。例如:
hashCode();getClass();clone();notify();notifyAll(); wait(); read0();
start0();
2、特点:
线程私有,可能栈溢出,不会垃圾回收。
JVM调优:调内存大小,选择垃圾回收器。
五、Java堆内存
存储程序中产生对象。
1、特点:
线程共享,可能内存溢出,会垃圾回收(垃圾回收的重点区域是堆),是JVM 管理中最大区域,堆内存大小可调节。
2、堆内存区域划分:
Eden:刚创建的对象存储区。
Survivor:存放Eden和另一个幸存者区经垃圾回收后存活下来的对象,两个幸存者区交替使用,都比较小。
OldGen:存储生命周期长的,非常大的,经过15次回收还存活的对象。
3、分区原因:
可根据不同存活时间进行划分,生命周期较长的对象,放在老年区,减少垃圾回收频率和扫描次数。
4、对象创建内存分配过程
1.新创建的对象放在Eden区,但Eden区大小有限;
2.当垃圾回收时,将Eden区存活的对象移入Survivor0中;
3.继续运行,再创建对象还是保存在Eden区。
4.下一次垃圾回收时,将Eden区存活的对象与Survivor0区中存活对象放入Survivor1中,反复交替执行;
5.当一个对象经历过15次垃圾回收次数后 仍存活,那么就将此对象移入OldGen,在对象头中4个bit位用来记录回收次数,可设置回收次数,最大值为15。
老年代:新生代 = 2:1,Eden:Survivor0:Survivor1 = 8:1:1
5、堆空间的参数设置
JVM调优是根据程序实际运行的需要设置的参数,调整各个区间比例大小。
垃圾回收名词:
Minor GC:针对新生代进行垃圾回收(频繁回收YoungGen)
Major GC:针对老年代进行垃圾回收(频繁回收OldGen)
Full GC:整堆收集 实际开发中尽量避免整堆收集。(老年代不足或方法区空间不足 时触发整堆收集)
6、方法区
主要用于存储加载到虚拟机的类信息 。
特点:
方法区大小可调节,线程共享,会垃圾回收。
方法区垃圾回收条件苛刻,要同时满足三个条件:
1、该类的所有对象和子类对象都不存在。
2、加载该类的加载器不存在了。
3、该类的Class对象不被其他地方引用。
因此认为一般情况下类是不会被卸载的。
相关文章:

JVM(上)
目录 一、JVM概述 一、JVM作用 二、JVM整体组成部分 二、JVM结构-类加载 一、类加载子系统概述 二、类加载过程 1.加载 2.链接 3.初始化(类加载过程中的初始化) 三、类加载器分类 大致分两类: 细致分类: 四、双亲委派机制 五、打…...

【js】js 异步机制详解 Generator / Async / Promise
三种语法功能放在一起,是因为他们都有相似特点: 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题: 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构?async 函数为什么返回一个 promise…...

【动态规划】【数学】【C++算法】805 数组的均值分割
作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 动态规划 数学 805 数组的均值分割 给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) average(B)…...
Django笔记(五):模型models
首 Django中的模型对应数据库中的一张表格。 定义模型 player.py from django.db import modelsclass Player(models.Model):idx models.IntegerField(uniqueTrue)def __str__(self):return str(self.id)每个模型需要继承models类,如上Player模型定义了一个整形…...

一个golang小白使用vscode搭建Ununtu20.04下的go开发环境
文章目录 前言搭建go环境下载go安装包解压go压缩包完成安装配置环境变量编写一个helloword程序 安装VSCode插件安装智能提示插件安装go依赖包修改代理并重新安装依赖包 go.mod 和 go.workgo.modgo.work小试一下go.work 总结 前言 先交代一下背景,距离正式接触golan…...

【复现】Hytec Inter HWL 2511 SS路由器RCE漏洞_25
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 Hytec Inter HWL 2511 SS是日本Hytec Inter 公司的一款工业级 LTE 路由器,可用于远程数据传输,例如收集传…...

Kafka系列(四)
本文接kafka三,代码实践kafkaStream的应用,用来完成流式计算。 kafkastream 关于流式计算也就是实时处理,无时间概念边界的处理一些数据。想要更有性价比地和java程序进行结合,因此了解了kafka。但是本人阅读了kafka地官网&#…...

【Linux学习】进程信号
目录 十七.进程信号 导言 17.1 linux中的信号列表 17.2 标准信号与实时信号 17.3 信号的产生 17.3.1 通过终端按键产生信号 17.3.2 调用系统函数产生信号 17.3.3 软件条件产生信号 17.3.4 硬件异常产生信号 17.3.5 【补充】核心转储 Core Dump 17.4 信号的阻塞 17.4.1 信号相关…...

机器学习没那么难,Azure AutoML帮你简单3步实现自动化模型训练
在Machine Learning 这个领域,通常训练一个业务模型的难点并不在于算法的选择,而在于前期的数据清理和特征工程这些纷繁复杂的工作,训练过程中的问题在于参数的反复迭代优化。 AutoML 是 Azure Databricks 的一项功能,它自动的对…...

数学建模实战Matlab绘图
二维曲线、散点图 绘图命令:plot(x,y,’line specifiers’,’PropertyName’,PropertyValue) 例子:绘图表示年收入与年份的关系 ‘--r*’:--设置线型;r:设置颜色为红色;*节点型号 ‘linewidth’:设置线宽࿱…...
TypeError the JSON object must be str, bytes or bytearray, not ‘list‘
在使用python的jason库时,偶然碰到以下问题 TypeError: the JSON object must be str, bytes or bytearray, not ‘list’ 通过如下代码可复现问题 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> import json >>> ra json.loads(a) Trac…...

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2Innovus)
吾爱IC社区星友提问:请教星主和各位大佬,对于一个模块如果不加干预工具会让inst挤成一团,后面eco修时序就没有空间了。如果全都加instPadding会导致面积不够overlap,大家一般怎么处理这种问题? 在数字IC后端设计实现中…...
产品经理与产品运营的区别和联系
一、两者的职责区别 产品经理的目的:是创造有价值的产品 产品运营的目的:是让产品能有效的发挥出它应有的价值 二、两者的工作内容区别产品经理的工作内容 产品的经理的目的是创造有价值的产品,因此产品经理的所有工作都是围绕着…...

CMU15-445-Spring-2023-分布式DBMS初探(lec21-24)
Lecture #21_ Introduction to Distributed Databases Distributed DBMSs 分布式 DBMS 将单个逻辑数据库划分为多个物理资源。应用程序(通常)并不知道数据被分割在不同的硬件上。系统依靠单节点 DBMS 的技术和算法来支持分布式环境中的事务处理和查询执…...
Arch linux 安装
Arch linux 安装 介绍下载制作iSO启动盘安装arch linux设置字体连接互联网 安装过程磁盘分区设置设置镜像源设置引导文件挂载点安装base等基础软件生成fatab文件更改时区更改编码、语言更改编码更改语言 用户管理设置root密码新建普通用户 安装grub启动网络服务/GDM查看系统网络…...

最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作
详情点击链接:最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…...

【leetcode】移除元素
大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…...

Spring Boot整合Redis的高效数据缓存实践
引言 在现代Web应用开发中,数据缓存是提高系统性能和响应速度的关键。Redis作为一种高性能的缓存和数据存储解决方案,被广泛应用于各种场景。本文将研究如何使用Spring Boot整合Redis,通过这个强大的缓存工具提高应用的性能和可伸缩性。 整合…...
FastApi-参数接收的正确使用(2)
前言 本文是该专栏的第2篇,后面会持续分享FastApi以及项目实战的各种干货知识,值得关注。 本文重点介绍,在使用FastApi使用“参数接收”时遇到的三种类型“路径参数”,“查询参数”,“请求体”的相关问题以及相应的解决方案。 具体详细知识点,跟着笔者直接往下看正文。…...
三、需求规格说明书(软件工程示例)
1.引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2.任务概述 2.1目标 2.2运行环境 2.3条件与限制 3.数据描述 3.1静态数据 3.2动态数据 3.3数据库介绍 3.4数据词典 3.5数据采集 4.功能需求 …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...

华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...