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

JVM深入学习(一)

目录

一.JVM概述 

1.1 为什么要学jvm?

1.2 jvm的作用 

1.3 jvm内部构造

二.JVM类加载

2.1类加载过程

2.2类加载器

2.3类加载器的分类

2.4双亲委派机制

 三.运行时数据区

堆空间区域划分(堆)

为什么分区(代)?(堆)

对象创建存储过程(堆)

jvm调优

方法区的垃圾回收(方法区)


一.JVM概述 

1.1 为什么要学jvm?

         1.面试的需要。 

         2.高级程序员需要了解 。

1.2 jvm的作用 

        jvm负责把编译后的字节码转缓缓为机器码。

1.3 jvm内部构造

类加载部分负责把硬盘上的字节码加载到内存中(运行时数据区)。
运行时数据区负责存储运行时产生的各种数据,类信息,对象信息,方法信息...
执行引擎负责将字节码转为机器码。
本地方法接口

调用本地方法。

Object类中的hashCode()--对象内存中的地址。

read0()方法调用操作系统,操作系统返回数据。

 垃圾回收

 使用引用计数法或可达性分析法来判断对象是否存活。

二.JVM类加载

类加载系统:负责将硬盘上的字节码文件加载到jvm中,生成类的Class对象,存储在方法区。 

2.1类加载过程

        1.加载:以二进制文件流进行读取 ,在内存中为类生成Class对象。

        2.链接:

                验证:验证文件格式是否正确,字节码文件都以(CAFEBABE标识开头)

                准备:为类的静态属性分配内存,并进行初始化赋值(不包含final修饰的)如:static int n=123;准备阶段先赋值默认0,初始化阶段时赋值123。

                注意:不包含用 final 修饰的 static 常量,在编译时进行初始化。

                 解析:将类中的符号引用替换为直接引用(把字节码的符号引用替换成内存中的直接引用)

3.初始化:(类加载完成的标志)

        初始化阶段主要是为类中静态成员进行赋值

        因为类加载执行完初始化,才说明类加载完成了。

类在哪些情况下会被加载

        1.调用类中的静态成员(变量(不是final修饰的常量),方法)

        2.new类的对象

        3.在类中执行main方法

        4.反射加载类(Class.forName()生成的class对象)

        5.子类被加载

类在以下两种情况下,是不会被加载的

1. 类作为数组类型
Demo demo[] = new Demo[10]; //new 的数组对象   不是Demo对象,Demo只是作为类型存在

2.只是访问类中的静态的常量
System.out.println(Demo.P);//优化   不加载整个类了,  只获取到用到的静态常量

2.2类加载器

        类加载器就是实际负责读取类的功能.

        类加载器分类: 站在jvm的角度上, 分为

        1.引导类加载器(不是用java写的,是用c/c++),负责读取加载java中底层系统库

        2.java写的类加载器(用来读取我们写的应用程序)

 输出为null,说明为引导类加载器写的,能输出则为java写的。

2.3类加载器的分类

再细分类加载器:

        1.启动类加载器

C/C++语言实现,负责加载java核心类库(系统库,java.lang)

        2. 扩展类加载器 

java语言实现,继承ClassLoader类,加载jre包下面的扩展类的jre/lib/ext子目录

        3.应用程序类加载器

用Java语言实现,继承ClassLoader类,用来加载我们自己的应用程序类

2.4双亲委派机制

        当加载一个类时,总是先让他的父级类加载器去加载,确保把系统中类优先加载,直到父类加载器找不到类时, 再逐级向下,让子级类加载器加载,如果子级也找不到, 最终抛类找不到异常。这就是双亲委派机制。

为什么这样做?

防止我们自己写的类替换了系统中的类(如:String类)

如何打破双亲委派机制?

自定义类加载器:MyClassLoader extends ClassLoader  

重写findClass()

 三.运行时数据区

        存储运行时产生的各种数据

程序计数器        用来记录每一个线程执行的指令位置,速度最快,是线程私有(每个线程都会有一个程序计数器),此区域不会出现内存溢出(不够用),也不会出现垃圾回收。
虚拟机栈

栈是运行的,解决程序方法执行。

在虚拟机中,运行我们java自己写的方法

调用方法时,方法入栈,运行结束出栈 (先进后出 栈顶的方法,称为当前栈帧)

一个方法就是一个栈帧,,在栈帧中存储局部变量,运行结果....

虚拟机栈也是线程私有的,线程之间互相隔离

栈区域不存在垃圾回收, 但是会存在内存溢出问题。

栈帧中存储内容:1.局部变量表 int a =10;    2.操作数栈 (计算过程) int c = a+b;

3.方法返回地址

本地方法栈

        是用来执行调用的本地方法的,是线程私有的,不会存在垃圾回收,会出现内存溢出问题。

堆的作用是用来存储java语言产生的对象的。

是运行时数据区中最大的一块内存空间, 空间大小可以设置。

堆空间是所有线程共享的。

堆空间是垃圾回收(没有用的垃圾对象,有周期性)的重点区域, 堆中没有被使用到的垃圾对象,会被垃圾回收器回收掉。有可能出现内存溢出。

方法区

方法区主要用来存储加载类的信息。

方法区的大小也是可以设置的。

方法区也会进行垃圾回收, 方法区也可能会出现内存溢出问题。

堆空间区域划分(堆)

堆分为:新生区(新生代/年轻代):伊甸园区、幸存者0区、幸存者1区

              老年区(老年代)

为什么分区(代)?(堆)

        可以将不同生命周期的对象存储在不同的区域,不同的区域采用不同的垃圾回收算法,使垃圾回收策略更加优化。

对象创建存储过程(堆)

新创建的对象都存储在伊甸园区。(如上述的图)

当垃圾回收时,将还被使用的对象,转移至某一个幸存者区,将伊甸园区垃圾对象进行清除。

当下次垃圾回收时,将伊甸园区存活的对象与当前正在使用的幸存者区存活的对象转移到另一个幸存者区(每次空闲一个幸存者区)。

当一个对象经历过15次垃圾回收后,仍然存活,那么就把该对象移动到老年代。

对老年代比较少的进行垃圾回收,在老年代空间不足时,对老年代会进行垃圾回收。

当回收后,内存仍然不足时,会出现FULL GC(整堆收集 应尽量避免)。

当整堆收集后仍然不够使用,那么就会出现内存溢出错误 --- OOM(OutOfMemoryError)

jvm调优

        可以根据程序具体的使用场景, 对运行时数据区的各种空间大小进行调整 例如:堆,方法区

②对垃圾回收器进行选择

方法区的垃圾回收(方法区)

        方法区的垃圾回收, 是对类信息进行回收的。

        类信息如果不再被使用,类信息也可以被卸载。

卸载条件:①该类所产生的对象都不存在了。

                  ②该类的Class对象,也不再被使用了。

                  ③ 加载该类的类加载器也被回收了。

 感谢你的阅读与关注,如有问题欢迎探讨!💓

相关文章:

JVM深入学习(一)

目录 一.JVM概述 1.1 为什么要学jvm? 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分(堆) 为什么分区(代)?&#xff08…...

Qt Creator 15.0.0如何更换主题和字体

1.打开Qt Creator 15.0.0 (Community), 2.点击编辑栏3.点击Preferences... 4.修改主题,点击环境,修改Theme:栏 5.修改字体大小,点击文本编辑器,修改字号栏。,修改Theme:栏...

“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce

文章目录 O 背景知识1 数据挖掘2 邦费罗尼原则3 TF.IDF4 哈希函数5 分布式文件系统 一、MapReduce基本介绍1. Map 任务2. 按键分组3. Reduce 任务4. 节点失效处理5.小测验:在一个大型语料库上有100个map任务和若干reduce任务: 二、基于MapReduce的基本运…...

shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别

Vue3 浅层响应式 API 1. ref vs shallowRef 1.1 基本概念 ref: 深层响应式,会递归地将对象的所有属性转换为响应式shallowRef: 浅层响应式,只有 .value 的改变会触发更新,不会递归转换对象的属性 1.2 使用对比 // ref 示例 const deepRe…...

maven、npm、pip、yum官方镜像修改文档

文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂&#xff0c;本文旨在记录各常见镜像官网&#xff0c;及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…...

HTML-新浪新闻-实现标题-样式1

用css进行样式控制 css引入方式&#xff1a; --行内样式&#xff1a;写在标签的style属性中&#xff08;不推荐&#xff09; --内嵌样式&#xff1a;写在style标签中&#xff08;可以写在页面任何位置&#xff0c;但通常约定写在head标签中&#xff09; --外联样式&#xf…...

Linux-day10

第21章 Linux高级篇-日志管理 日志介绍和实例 基本介绍 系统常用的日志 日志服务 日志服务原理图 在这个配置文件里面记录了日志服务程序 日志管理服务rsyslogd -v是反向匹配 invert 日志服务配置文件 时间、主机、是由哪个程序或者服务发生的、事件信息 自定义日志服务 日…...

【Unity3D】《跳舞的线》游戏的方块单方向拉伸实现案例

通过网盘分享的文件&#xff1a;CubeMoveMusic.unitypackage 链接: https://pan.baidu.com/s/1Rq-HH4H9qzVNtpQ84WXyUA?pwda7xn 提取码: a7xn 运行游戏点击空格动态创建拉伸的方块&#xff0c;由Speed控制速度&#xff0c;新方向是随机上下左右生成。 using System.Collect…...

AI智能日志分析系统

文章目录 1.combinations-intelligent-analysis-starter1.目录结构2.pom.xml3.自动配置1.IntelligentAnalysisAutoConfiguration.java2.spring.factories 2.combinations-intelligent-analysis-starter-demo1.目录结构2.pom.xml3.application.yml4.IntelligentAnalysisApplicat…...

试用ChatGPT开发一个大语言模型聊天App

参考官方文档&#xff0c;安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限&#xff1a; https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…...

Unity Epplus读取excel表并存入So文件举例

目录 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 这是读表工具 So文件这么写 使用 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 在此之前你需要知道epplus是干什么的&#xff0c;然后知道其基本api&#xff0…...

连接 OpenAI 模型:基础操作

在这一部分中&#xff0c;我们将介绍如何连接 OpenAI 模型&#xff0c;设置 API 密钥&#xff0c;并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具&#xff0c;使得开发者能够更轻松地与 GPT 系列模型进行交互。 …...

[ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025

文章目录 IntroduceProject StructureDeclare Plugins and ModulesApply Plugins and Add DependenciesSender PropertiesSender ApplicationSender ControllerReceiver PropertiesReceiver ApplicationReceiver Message HandlerCongratulationsAutomatically Send Message By …...

ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”

22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复&#xff0c;重启后有软件包冲突&#xff0c;sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…...

力扣-链表-203 移除链表元素

思路1 处理头节点&#xff0c;然后遍历下一个节点&#xff0c;只有确保下一个节点不是要移除的节点时再跳到下一个节点 代码1 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while(head ! nullptr && head->val val){head head…...

Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记

Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示&#xff1a; 参考资料及链接&#xff1a; 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中&#xff1a;顶点噪波影响网格着色器配合粒子实现水特效 …...

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…...

Linux——网络(udp)

文章目录 目录 文章目录 前言 一、upd函数及接口介绍 1. 创建套接字 - socket 函数 2. 绑定地址和端口 - bind 函数 3. 发送数据 - sendto 函数 4. 接收数据 - recvfrom 函数 5. 关闭套接字 - close 函数 二、代码示例 1.服务端 2.客户端 总结 前言 Linux——网络基础&#xf…...

Oracle-Java JDBC 连接超时之后的认知纠正

背景 偶然读到熊老师的文章《老熊的三分地-JDBC中语句超时与事务》了解到&#xff1a;JAVA代码的最后正常断开数据库连接&#xff0c;在默认情况下&#xff0c;正常断开的数据库连接会自动提交没有提交的事务。   通过文章的测试JAVA程序&#xff0c;可以表明&#xff0c;JDB…...

基于ROS的语音控制机器人(一):从零搭建多模态交互系统

1. 从零搭建ROS语音控制机器人的核心思路 第一次接触ROS机器人开发时&#xff0c;我被其分布式架构深深吸引。想象一下&#xff1a;你对着电脑说"前进"&#xff0c;树莓派就能驱动小车移动&#xff1b;喊"打开摄像头"&#xff0c;机器人立即开启视觉识别—…...

【实战指南】彻底解决conda环境变量配置错误:从报错分析到.bashrc修复

1. 遇到conda环境变量报错怎么办&#xff1f; 刚装完Anaconda/Miniconda&#xff0c;满心欢喜准备大展身手&#xff0c;结果终端里输入conda却蹦出一行刺眼的红色报错&#xff1a;"bash: /opt/conda/bin/conda: No such file or directory"。这种场景我见过太多次了&…...

Z-Image-Turbo_Sugar脸部Lora模型轻量化:基于.NET框架的推理引擎封装

Z-Image-Turbo_Sugar脸部Lora模型轻量化&#xff1a;基于.NET框架的推理引擎封装 最近在做一个C#的桌面工具&#xff0c;需要集成一个AI换脸功能。网上找了一圈&#xff0c;发现Z-Image-Turbo_Sugar这个脸部Lora模型效果不错&#xff0c;但官方只提供了Python的推理脚本。对于…...

Kubernetes 与 GitOps 最佳实践

Kubernetes 与 GitOps 最佳实践 一、前言 哥们&#xff0c;别整那些花里胡哨的。GitOps 是现代 Kubernetes 运维的重要趋势&#xff0c;今天直接上硬货&#xff0c;教你如何在 Kubernetes 中实现 GitOps 工作流。 二、GitOps 核心概念 概念描述优势声明式配置所有配置以声明式方…...

反激式电源设计避坑指南:如何优化5V/2A方案的EMI和效率

反激式电源设计避坑指南&#xff1a;如何优化5V/2A方案的EMI和效率 在中小功率电源设计中&#xff0c;反激式拓扑凭借结构简单、成本低廉的优势占据主流地位。但当工程师面对5V/2A这类常见规格时&#xff0c;往往会陷入效率卡在65%难以提升、EMI测试屡次失败的困境。本文将从实…...

CayenneMQTT库详解:嵌入式设备快速接入MQTT平台

1. CayenneMQTT 库概述 CayenneMQTT 是一个专为物联网设备设计的轻量级 MQTT 客户端库&#xff0c;核心目标是将嵌入式终端&#xff08;如 Arduino、ESP8266、ESP32&#xff09;快速、可靠地接入 Cayenne IoT 平台 的可视化仪表盘。该库并非从零实现 MQTT 协议栈&#xff0c…...

Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测

Qwen3-Reranker-0.6B效果展示&#xff1a;长文档片段&#xff08;32K&#xff09;语义匹配能力实测 1. 引言&#xff1a;当搜索遇到“大海捞针” 你有没有过这样的经历&#xff1f;面对一份几十页的PDF报告&#xff0c;或者一个包含数千条记录的数据库&#xff0c;想快速找到…...

别再只盯着运放了:用跨阻放大器搞定光电传感器信号调理的完整指南

光电传感器信号调理实战&#xff1a;跨阻放大器设计与避坑指南 当你在昏暗的灯光下测试光电传感器时&#xff0c;是否曾被微弱的电流信号折磨得焦头烂额&#xff1f;作为嵌入式工程师&#xff0c;我曾在凌晨三点的实验室里&#xff0c;面对闪烁不定的示波器波形&#xff0c;才…...

Unity坐标系实战解析:从localPosition到Position的层级关系与应用场景

1. 理解Unity中的坐标系基础 在Unity开发中&#xff0c;坐标系系统是构建3D世界的基石。很多新手开发者容易混淆localPosition和Position的概念&#xff0c;导致物体位置控制出现各种"灵异现象"。我们先从一个生活场景来理解&#xff1a;想象你站在客厅里&#xff08…...

Meta2d.js终极指南:从零构建专业级Web SCADA与数字孪生应用

Meta2d.js终极指南&#xff1a;从零构建专业级Web SCADA与数字孪生应用 【免费下载链接】meta2d.js The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so on. Meta2d.js是一个实时数…...