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

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

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

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

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

相关文章

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中,我们常常会遇到各种有趣且具有挑战性的问题。今天,我们就来深入探讨一个在实际开发中较为常见的问题:当连续快速发送 Post 请求时,前端会弹出 “数据正在处理,请…

002-SpringBoot整合AI(Alibaba)

SpringBoot整合AI 一、引入依赖二、配置application.yml三、获取 api-key四、编写 controller五、起服务调用 一、引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><vers…

安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性

随着企业不断推进数字化转型&#xff0c;传统培训方式已无法满足现代企业对高效、灵活培训的需求。尤其在技术更新频繁、工艺流程复杂、员工流动性大的环境中&#xff0c;传统培训模式的局限性愈加明显。为了提升培训质量、降低培训成本&#xff0c;并帮助员工迅速掌握新技能&a…

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…

Windows 下本地 Docker RAGFlow 部署指南

Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…

【学习笔记】计算机网络(二)

第2章 物理层 文章目录 第2章 物理层2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和…

linux设置mysql远程连接

首先保证服务器开放了mysql的端口 然后输入 mysql -u root -p 输入密码后即可进入mysql 然后再 use mysql; select user,host from user; update user set host"%" where user"root"; flush privileges; 再执行 select user,host from user; 即可看到变…

Midscene.js:重新定义UI自动化的新时代工具

前言 Midscene.js 是一个创新的、面向开发者的 UI 自动化解决方案&#xff0c;并通过人工智能技术简化自动化脚本的编写与维护。 它提供了三种核心方法——交互&#xff08;.ai, .aiAction&#xff09;、提取&#xff08;.aiQuery&#xff09;和断言&#xff08;.aiAssert&am…

AndroidStudio 下载链接

AndroidStudio 各个版本下载地址 AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 AndroidStudio 各个版本所支持的api 版本标识 Android Studio Ladybug 功能更新 |2024 年 2 月 2 日 | Android Developers

【开源免费】基于Vue和SpringBoot的社区智慧养老监护管理平台(附论文)

本文项目编号 T 163 &#xff0c;文末自助获取源码 \color{red}{T163&#xff0c;文末自助获取源码} T163&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Oracle查看数据库表空间使用情况

Oracle RAC环境查看表空间使用情况 查询字段释义&#xff1a; NEED_ADDFILE,--是否需增加表空间文件 TABLESPACE_NAME,--表空间名称 TABLESPACE_FILE_COUNT, --表空间当前数据文件数量 NOW_FILEENABLE_BLOCKS,--表空间文件当前数据块数 NOW_FILEENABLE_BYTES_GB,--表空间文件当…

从0到1:C++ 开启游戏开发奇幻之旅(一)

目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境&#xff08;IDE&#xff09; Visual Studio CLion 图形库 SDL&#xff08;Simple DirectMedia Layer&#xff09; SFML&#xff08;Simple and Fast Multim…

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展&#xff0c;我们的生活似乎也变得更加“鲜活”、有趣、便捷&#xff0c;包具有科技感的。在物联网&#xff08;IoT&#xff09;领域中&#xff0c;也有许多优秀的开源框架支持设备连接、数据处理、云服务等&#xff0c;成为被用户们广泛认可的存在。以下给大家…

Shodan Dorks安装指南,通过Shodan搜索漏洞

Shodan Dorks是一种基于Shodan的工具&#xff0c;不知道Shodan是什么的不必阅读下面的内容。简单的说就是&#xff0c;利用预定义的查询&#xff08;dorks&#xff09;&#xff0c;通过Shodan轻松搜索漏洞和机密信息。 推荐渗透测试人员自行测试。 安装方法&#xff1a; 1.确…

Vue3 v-bind 和 v-model 对比

1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…

Mybatis-plus 更新 Null 的策略踩坑记

一个bug 在一个管理页面&#xff0c;有一个非必填字段被设置成空了并提交更新&#xff0c;再次打开的时候&#xff0c;发现字段还在&#xff0c;并没有被更新成功。 使用的数据库映射框架是 Mybatis-plus &#xff0c;对于Mybatis 在更新字段的时候会对空进行校验&#xff0c;…

Linux第一讲--基本的命令操作

从今天开始&#xff0c;我将在csdn这个平台上和大家分享Linux的相关知识&#xff0c;欢迎大家一起讨论&#xff01; 零、基本操作 1.进入全屏&#xff1a; ALTENTER,退出也是这个 2.复制&#xff1a;ctrlinsert 3.粘贴&#xff1a;shiftinsert Linux中&#xff0c;cv是不好…

[CISCN2019 华东南赛区]Web41

进入题目页面如下 点击链接但发现 各种尝试无果 看了一个大佬的博客&#xff0c;链接如下 BUUCTF&#xff1a;[CISCN2019 华东南赛区]Web4-CSDN博客 给了很大的提示&#xff0c;大佬尝试了file:///etc/passwd无果&#xff0c;猜测Flask&#xff0c;尝试local_file:///读取文…

make controller vibrate and 判断是否grab

我自己的例子&#xff0c;新建cube上挂载oculus交互的代码&#xff0c;如下 然后加载自己写的代码到cube上就可以了 using Oculus.Interaction.HandGrab; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Vibtation : MonoBehav…

渗透测试技法之口令安全

一、口令安全威胁 口令泄露途径 代码与文件存储不当&#xff1a;在软件开发和系统维护过程中&#xff0c;开发者可能会将口令以明文形式存储在代码文件、配置文件或注释中。例如&#xff0c;在开源代码托管平台 GitHub 上&#xff0c;一些开发者由于疏忽&#xff0c;将包含数据…