Java开发:JVM篇-类加载内存分析

【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出 一、前言最近要准备找工作,JVM肯定是跑不掉的面试内容,所以把JVM相关的内容拿来认真学习一遍,整理成自己能够快速消化的提纲,方便随时可以调用。主要分JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略 四个方面展开。二、JVM结构JVM的内部结构直接贴图: 各部分的主要功能: 类加载器 JVM启动,程序开始执行时,负责将class字节码加载到JVM内存区域中 执行引擎 负责 阅读详情

一、类加载器

A、类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据结构转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

B、类缓存

标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持(缓存)加载一段时间。不过JVM垃圾回收机制可以回收这些Class对象。
示意图
类加载器的作用002

示例代码:


public class Lesson007 {
    public static void main(String[] args) {
        try {
            //系统类加载器
            ClassLoader sClassLoader = ClassLoader.getSystemClassLoader();
            System.out.println("系统类加载器--->" + sClassLoader);

            //扩展类加载器
            ClassLoader eClassLoader = sClassLoader.getParent();
            System.out.println("扩展类加载器--->" + eClassLoader);

            //根加载器(c/c++)
            ClassLoader rClassLoader = eClassLoader.getParent();
            System.out.println("根加载器--->" + rClassLoader);

            //测试当前类是哪个类加载器
            ClassLoader cClassLoader = Class.forName("com.baidu.baike.lesson.annotations_reflection.Lesson007").getClassLoader();
            System.out.println("当前类加载器--->" + cClassLoader);

            //JDK类使用的哪个加载器
            ClassLoader oClassLoader = Class.forName("java.lang.Object").getClassLoader();
            System.out.println("JDK中的类使用的加载器--->" + oClassLoader);

            //如何获得系统类加载器可以加载的路径
            System.out.println("系统类加载器可以加载的路径--->" + System.getProperty("java.class.path"));
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

运行结果:
系统类加载器--->sun.misc.Launcher$AppClassLoader@18b4aac2
扩展类加载器--->sun.misc.Launcher$ExtClassLoader@74a14482
根加载器--->null
当前类加载器--->sun.misc.Launcher$AppClassLoader@18b4aac2
JDK中的类使用的加载器--->null
系统类加载器可以加载的路径--->
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\charsets.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\access-bridge-64.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\cldrdata.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\dnsns.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\jaccess.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\jfxrt.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\localedata.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\nashorn.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\sunec.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\sunjce_provider.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\sunmscapi.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\sunpkcs11.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\ext\zipfs.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\jce.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\jfr.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\jfxswt.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\jsse.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\management-agent.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\resources.jar;
C:\Users\86157\.jdks\corretto-1.8.0_292\jre\lib\rt.jar;
D:\code\JavaProject\MyProject\MyProject\out\production\MyProject;
D:\code\JavaProject\MyProject\MyProject\src\lib\commons-io-2.10.0.jar;
D:\software\IDEA\IntelliJ IDEA 2022.2.3\IntelliJ IDEA Community Edition 2022.2.3\lib\idea_rt.jar

二、分析类初始化

什么时候会发生类初始化?

A、类的主动引用(一定会发生类的初始化)

  • 当虚拟机启动,先初始化main方法所在的类
  • new 一个类的对象
  • 调用类的静态成员(除了final常量)和静态方法
  • 使用java.lang.reflect包的方法对类进行反射调用
  • 当初始化一个类,如果其父类没有被初始化,则会先初始化它的父类

B、类的被动引用(不会发生类的初始化)

  • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化。
  • 通过数组定义类引用,不会触发此类的初始化
  • 引用常量不会触发此类的初始化(常量在链接阶段就存入了调用类的常量池中了)

public class Lesson006 {
    public static void main(String[] args) {
//        System.out.println("调用Son类的M值为:" + Son.C_M);
//        System.out.println("调用Son类的c_m+" + Son.c_m);

        //主动引用
//        Son son = new Son();


        //反射也会产生主动引用
//        try {
//            Class.forName("com.baidu.baike.lesson.annotations_reflection.Son");
//        } catch (ClassNotFoundException e) {
//            throw new RuntimeException(e);
//        }

        //不会产生类的引用方法
//        System.out.println("调用父类的静态参数f_b = " + Son.f_b);
//        Son[] sons = new Son[5];
//        System.out.println("调用子类的静态常量C_M = " + Son.C_M);
    }
}

class Father {
    static int f_b = 2;

    static {
        System.out.println("父类的静态方法被加载");
    }
}


class Son extends Father {
    static {
        System.out.println("子类的静态方法被加载");
        c_m = 300;
    }

    static int c_m = 100;
    static final int C_M = 1;
    String C_CLASS_NAME = Son.class.getSimpleName();

    public Son() {
        System.out.println("子类的构造函数被加载--->" + C_CLASS_NAME);
    }
}

三、类加载内存分析

类加载内存分析001

A、加载

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象。

B、链接

将Java类的二进制代码合并到JVM的运行状态之中的过程。

  • 验证:确保加载的类信息符合JVM规范,没有安全方面的问题。
  • 准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
  • 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

C、初始化

  • 执行类构造器**方法的过程**。类构造器()方法是编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。
  • 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
  • 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。

D、示例

1、示例代码

示例:
public class Lesson005 {
    public static void main(String[] args) {
        System.out.println("获取A类的m值为="+A.m);
    }
}

class A {
    static {
        System.out.println("A类静态代码初始化");
        m = 300;
    }

    static int m = 100;

    public A() {
        System.out.println("A类无参构造初始化");
    }
}

运行结果:
A类静态代码初始化
获取A类的m值为=100

2、运行逻辑分析

a、加载到内存,会产生一个类对应Class对象
b、链接,链接结束后 m=0
c、初始化
(){
System.out.println(“A类静态代码初始化”);
m = 300;
m = 100;
}
d、最终 m=100

3、运行分析图

上述代码运行分析图:
在这里插入class加载运行分析图图片描述

end

机器人控制入门 机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位 阅读详情

相关推荐

「Debug R」在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’...

每当R语言版本更新,Bioconductor的版本随之更替的时候,总会有一些神奇的报错会出现,比如说下面这种。 Error: package or namespace load failed for ‘GenomicRanges’: 在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’ 如果读中文读不懂,我们可以把它翻译成英文。 packa...

xuzhougeng blog 1999

Java类加载过程内存分析

Java类加载过程内存分析Java类加载过程编译类的加载类加载器运行时数据区执行引擎 Java类加载过程 具体过程如下: 编译 首先Java源代码会被编译器编译成class文件以供计算机执行(详细过程可参考编译原理)。java编译一个类时,若这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。 类的加载 类的加载过程为: 加载 --> 链接(验证 --> 准备 --> 解析) --> 初始化 加载过程的任务主要是根据类的权限和路径名查找并导入我们的class文

qq_41965041的博客 824

避坑指南:C# OpenCvSharp调用4K摄像头常见的5个问题及解决方案

本文针对C# OpenCvSharp调用4K高清摄像头时常见的五大难题,提供了详细的解决方案。内容涵盖分辨率设置失效、帧率卡顿、内存泄漏、硬件驱动兼容性以及性能优化实战,帮助开发者高效稳定地处理4K视频流,提升智能安防监控等项目的开发效率。

weixin_29268331的博客 422

【面试精讲】JVM 的内存布局和运行原理(附代码)

JVM的内存布局分为若干个独立的区域,主要包括堆(Heap)、方法区(Method Area)、程序计数器(Program Counter Register)、虚拟机栈(VM Stack)和本地方法栈(Native Method Stack)。

小明的Java问道之路 1万+

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 221

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3058

jvm万字总结(图文+代码示例)

文章目录一、什么是JVM定义好处比较二、内存结构整体架构1、程序计数器作用特点2、虚拟机栈定义1. 局部变量表2. 操作栈3. 动态链接4.方法返回地址3、本地方法栈4、堆1.Eden区2.Survival from to3.老年代总结5、方法区常量池运行时常量池字符串常量池intern方法 1.8intern方法 1.66、直接内存释放原理直接内存的回收机制总结三、垃圾回收1、如何判断对象可以回收引用计数法可达性分析算法五种引用强引用软引用弱引用虚引用终结器引用引用队列2、垃圾回收算法标记-清除标记-整理

qq_51232471的博客 4823

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2644

【JVM】如何定位、解决内存泄漏和溢出

如何定位JVM内存泄漏和内存溢出问题?实战干货!一文详聊!快速上手!

BugMan的博客 6775

YOLO11涨点优化:创新多尺度卷积注意力(MSCA)模块,小目标检测神器!

MSCA模块通过创新的多尺度设计,在保持计算效率的同时显著提升小目标检测能力。实验证明,在YOLOv5/v8等模型上嵌入MSCA后,mAP提升超过2%,小目标检测精度提升近4%,且计算代价增加极小。注意力机制的未来发展方向动态核尺寸:根据输入特征自适应调整卷积核大小跨模态融合:结合RGB与深度/热力图等多模态信息自监督优化:利用对比学习预训练注意力模块尝试在你的YOLO模型中插入MSCA模块,欢迎在评论区分享你的涨点结果!参考文献。

QQ_778132974的博客 470

养龙虾之_因特尔UHD/ULtra/Arc核显跑大模型_安装ollama_跑qwen3.5:0.8b/9b_使用copaw1.0.1测试_并配置copaw技能效果炸裂---AI大模型应用探索0019

摘要:本文探讨了利用Intel UHD770核显运行大语言模型的可能性。通过使用Intel发布的ipex-llm项目工具包,成功在核显上运行了Qwen3.5系列模型。测试发现0.8B小模型运行流畅(3-5秒响应),但智能程度有限;而9B大模型虽然效果更好,但响应时间长达2分钟,且GPU/CPU占用率不高。实验证明Intel核显确实可以运行LLM,但实际效果和性能表现仍有提升空间,特别是对大模型的支持尚不理想。

添柴程序猿的专栏 233

JAVA类的加载机制与对象创建的内存变化

java面向对象基础;类的加载机制;创建对象的内存变化

m0_66501633的博客 422

HyperLynx(十九)DDR(二)DDR的地址仿真

(5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。

小幽余生不加糖 4257

JVM(内存划分+类加载+GC)

🐲 1. JVM 内存划分 🐲 2. JVM 类加载 🦄 2.1 类型加载是干啥的 🦄 2.2 类加载的简略流程 🦄 2.3 什么时候会进行类加载 🦄 2.4 双亲委派模型 🐲 3. GC 垃圾回收机制 🦄 3.1 GC 是什么 🦄 3.2 GC 回收哪部分内存 🦄 3.3 GC 具体是怎么回收的 🦖 3.3.1 怎么判定某个对象是否是垃圾 (引用计数/可达性分析) 🦖 3.3.2 具体是怎么回收的 (标记清除/复制算法/标记整理/分代回

m0_58761900的博客 3975

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JVM内存模型与类加载机制

JVM内存模型与类加载机制(以前的笔记)

分享学习编程中的遇到的问题,总结平时的笔记 3338

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM系列之内存与垃圾回收篇

JVM系列之内存与垃圾回收篇       今天听同事说,当996成为常态,没有一个程序员是无辜的 话说,咱们程序员总是有一颗想要学习的心,套用网上的一句话就是:一天不学习,浑身难受啊!!! 文章目录JVM系列之内存与垃圾回收篇前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机

JSDSFY的博客 2841

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java类加载与JVM详解:从基础到双亲委托机制

本文深入解析Java虚拟机的核心机制。首先阐明JDK、JRE和JVM的层级关系,详细剖析JVM内存结构,包括方法区、堆、栈等核心区域。重点讲解类加载机制,涵盖加载时机、流程和双亲委托模型原理,通过自定义String类案例演示安全机制。最后介绍类加载器的常用方法,如资源文件加载等。理解这些底层机制对优化性能、排查问题及掌握高级特性具有重要意义。

m0_73073987的博客 1392

JVM内存分析:jmap工具深度解析

在当今的软件开发领域,Java虚拟机(JVM)作为Java程序运行的核心环境,其性能和稳定性直接影响到应用程序的运行效率。在这个过程中,JVM的性能监控和问题诊断显得尤为重要。jmap,作为JVM提供的一款强大的性能监控工具,能够帮助我们深入了解JVM的内存使用情况,从而优化程序性能。想象一下,在一个大型企业级应用中,由于业务需求复杂,系统运行过程中可能会出现内存泄漏、对象生命周期管理不当等问题。这些问题如果不及时解决,可能会导致系统性能下降,甚至出现崩溃。此时,jmap工具就能发挥其重要作用。

MoneyHacksPro的博客 975

【JVM】——JVM运行机制、类加载机制、内存划分

JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型

阿华的博客 1300

JVM详解:内存管理与类加载机制

JVM详解:内存管理与类加载机制

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1188

面试篇-Java-3+类加载+JVM 内存划分

你知道类的加载过程吗,你了解过jvm 吗。本文重点对面试的问题进行介绍,祝愿每位程序员都能顺利上岸!!!本文对jvm 类加载,以及jvm 内存结构常见面试题进行汇总。

拽着尾巴的鱼儿的博客 1155

【Java 复习日记 04】深入JVM:内存、类初始化与类加载的艺术

《JVM内存模型与类加载机制解析》 本文系统介绍了JVM内存结构、类加载机制及内存问题。JVM内存分为程序计数器、虚拟机栈、堆、方法区等区域,其中堆又分为新生代和老年代,采用分代设计优化GC效率。类加载过程包括加载、连接、初始化等七个阶段,由启动类加载器、扩展类加载器等分层完成。文章重点区分了内存泄漏(对象无法回收)和内存溢出(内存不足)两种常见问题,并分析了它们的成因和解决方案。通过深入理解JVM运行机制,开发者可以编写更高效、稳定的Java程序,并具备定位内存问题的能力。

感谢阅读。 1553

【JVM】使用 IntelliJ IDEA 进行 Java 内存分析

通过本篇文章,你学习了如何使用进行 Java 内存分析。使用查看内存使用情况。使用Heap Dump诊断内存泄漏。分析垃圾回收的情况,优化性能。的内存分析工具非常强大,能够帮助开发者快速定位内存问题,提升应用程序的性能和稳定性。希望通过本篇文章,你能够更好地理解和使用 IDEA 的内存分析工具,从而提升开发效率。

小蜗牛的珍贵百宝箱 5281

Java JVM --- JVM内存区域划分,类加载,GC垃圾回收

循环引用:存在一个a引用一个对象,一个b引用一个对象,然后a里的的t引用b对象,b里面的t引用a对象,再把a对象和b对象置为null,销毁两引用。那么这两个对象中的t互相引用,要拿到a对象中的t,需要b对象中的t,要拿到b对象中的t,需要a对象中的t。,时间上消耗比较大),当前某个对象是否是垃圾,是随着代码的执行,会发生改变(可能当前这个不是垃圾,随着代码的执行,这个就变成了垃圾)此时这个空间上的内存的数值,就是全0的。(方法区里,每个方法,里面的指令,都是以二进制的形式存在的,保存到对应的类对象中的)

的博客 1579

Java——《面试题——JVM篇》

JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着JVM启动及销毁,另外一 些区域的数据是线程性独立的,随着线程创建和销毁。jvm内存模型总体架构图如下:(摘自oracle 官方网站)JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建 销毁时间。如下图所示,可以分为两大部分,线程私有区和共享区。下图是根据自己理解画的一个 JVM内存模型架构图:JVM内存分为线程私有区和线程共享区线程私有区1、程序计数器。

行秋的博客 5690

深入理解JVM:内存结构、垃圾回收、类加载、内存模型

深入理解JVM:内存结构、垃圾回收、类加载、内存模型

Henrik-Yao的博客 3301
上一篇: Java开发:注解Annotation
下一篇: Java开发:反射机制
android157
博客等级 码龄9年 193粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值