JVM深入学习(一)

news2025/1/29 6:34:01

目录

一.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对象,也不再被使用了。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

视觉语言模型 (VLMs):跨模态智能的探索

文章目录 一. VLMs 的重要性与挑战:连接视觉与语言的桥梁 🌉二. VLMs 的核心训练范式:四种主流策略 🗺️1. 对比训练 (Contrastive Training):拉近正例,推远负例 ⚖️2. 掩码方法 (Masking):重构…

CF 339A.Helpful Maths(Java实现)

题目分析 输入一串式子,输出从小到大排列的式子 思路分析 如上所说核心思路,但是我要使用笨方法,输入一串式子用split分割开,但是此时需要用到转义字符,即函数内参数不能直接使用“”,而是“\\”。分割开后…

Java Web-Request与Response

在 Java Web 开发中,Request 和 Response 是两个非常重要的对象,用于在客户端和服务器之间进行请求和响应的处理,以下是详细介绍: Request(请求对象) Request继承体系 在 Java Web 开发中,通…

Spring AOP通知类型全解析:掌握方法执行前后的艺术

Spring的通知(Advice)类型主要有以下几种,它们都是在方法执行的不同阶段进行拦截和处理的一种机制: 1. 前置通知(Before Advice):在目标方法执行之前执行的通知。就像你吃饭前要先洗手一样&…

(一)HTTP协议 :请求与响应

前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议&#xff…

未初始化数据恢复全攻略

没有初始化概述 在日常使用电脑、硬盘、U盘等存储设备时,我们可能会遇到“没有初始化”的提示。这一情况通常发生在存储设备突然无法被系统正常识别或访问时,系统往往要求我们先进行初始化操作。然而,初始化操作意味着对存储设备进行格式化&…

学习数据结构(1)算法复杂度

1.数据结构和算法 (1)数据结构是计算机存储、组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合 (2)算法就是定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组…

Github 2025-01-25Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-01-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Vue项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型…

免费GPU算力,不花钱部署DeepSeek-R1

在人工智能和大模型技术飞速发展的今天,越来越多的开发者和研究者希望能够亲自体验和微调大模型,以便更好地理解和应用这些先进的技术。然而,高昂的GPU算力成本往往成为了阻碍大家探索的瓶颈。幸运的是,腾讯云Cloud Studio提供了免…

積分方程與簡單的泛函分析7.希爾伯特-施密特定理

1)def函數叫作"由核生成的(有源的)" 定义: 设 是定义在区域上的核函数。 对于函数,若存在函数使得, 则称函数是“由核生成的(有源的)”。 这里的直观理解是: 函数的“来源”可以通过核函数 与另一个函数的积分运算得到。 在积分方程理论中,这种表述常…

2025年PHP面试宝典,技术总结。

面试是进入职场的第一道坎,因为我本身学校太一般的问题在面试中遇到了各种不爽,和那些高学历的相比自己真是信心大跌。我面试的方向是php开发工程师,主要做网站后台、APP接口等。下面是我这段时间总结的面试方面的常考常问的知识点&#xff0…

追剧记单词之:国色芳华与单词速记

●wretched adj. 恶劣的;悲惨的;不幸的;难过的 (不幸的)胜意出生于一个(恶劣的)家庭环境,嫁给王擎后依然过着(悲惨的)生活,她死后,牡丹…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始,各大技术社区,技术群聊流行着 “用Rust重写!” ,放一张图(笑死… 这不, 随着大模型技术的流行,大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构,代码变换(Refactor&…

基于SpringBoot+WebSocket的前后端连接,并接入文心一言大模型API

前言: 本片博客只讲述了操作的大致流程,具体实现步骤并不标准,请以参考为准。 本文前提:熟悉使用webSocket 如果大家还不了解什么是WebSocket,可以参考我的这篇博客: rWebSocket 详解:全双工…

大数运算之C语言实现

一、 前言 在我们代码编程过程中,我们经常需要处理各种规模的数值。从日常工作中的一些简单算术在到科学研究中的复杂计算,数字无处不在。然而,当数值变的异常庞大时,就需要用到大数运算来进行实现。本文我们将介绍大数运算的基本…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器:总告警次数:{{ServerTotal}} 服务器IP:{{IPA}},总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}},总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

Linux系统编程:进程状态和进程优先级/nice

目录 一,相对于OS的进程状态 1.1运行状态 1.2阻塞状态 1.3挂起状态 二,并发执行与进程切换 2.1,CPU并发执行 2.2进程切换 三,Linux内核管理进程状态的方法 3.1查看进程状态 3.2R状态 3.3S状态 3.4D状态 3.5T状态 3.6X状态 3.7Z状态 3.8孤儿进程 四,进程优先级 …

0 基础学运维:解锁 K8s 云计算运维工程师成长密码

前言:作为一个过来人,我曾站在技术的门槛之外,连电脑运行内存和内存空间都傻傻分不清,完完全全的零基础。但如今,我已成长为一名资深的k8s云计算运维工程师。回顾这段历程,我深知踏上这条技术之路的艰辛与不…