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

JVM基础学习

JVM分为两个子系统,两个组件

一个子系统是Class loader类装载系统,另一个子系统是Execution Engine执行引擎

一个组件是Runtime data area 运行时数据区,Native Interface 本地接口

Class loader:根据给定的全限定类名来装载class文件到运行时数据区的方法区

执行引擎执行classses中的指令

本地接口,用来和其他语言交互,Android的JNI

运行时数据区:就是JVM的内存

作用:通过编译器将java文件转成字节码,ClassLoader将字节码加载到内存(运行时数据区),字节码是JVM的一套指令集规范,不能直接给底层操作系统执行,需要经过执行引擎将字节码翻译成底层系统指令,再交给CPU去执行,这个过程需要调用本地接口来实现

编写的java源码.java文件,通过javac转成字节码.class文件,classLoader将这些.class文件加载到JVM内存,就是运行时数据区,classLoader将.class文件的二进制数据加载到jvm内存的方法区,然后在堆区创建对应的类对象,用来封装类在方法区的数据结构。

JVM内存,就是只JVM的运行时数据区此区域包含:

线程数据共享区:方法区,堆区

线程数隔离区:虚拟机栈,方法栈,程序计数器

  1. 程序计数器:当前程序所执行的字节码行号指示器,字节码解析的工作就是通过改变计数器的值,一行一行的解析字节码指令,分支、循环、跳转、异常处理,线程恢复等基础功能都依赖这个计数器

  1. 虚拟机栈:存储局部变量表、操作数栈、动态链接、方法出口

  1. 本地方法:与虚拟机栈作用一样,只是为了调用native方法服务

  1. 堆区:jvm内存中最大的一块,被所有线程共享,几乎所有对象的实例都在这里分配内存

  1. 方法区:用来存储已经被加载到JVM内存的类信息,常量,静态变量,即时编译后的数据

浅拷贝:内存地址是同一个,增加一个指针指向此内存地址

深拷贝:增加一个指针且申请一个新的内存地址,指针指向的是新的内存地址

浅复制:复制被指向的内存地址,如果原地址发生变化,浅复制出来的对象也会发生变化

深复制:在计算机中开辟一块新的内存地址用来存放复制的对象

堆栈区别:

物理地址:

堆的物理地址是不连续的,栈的物理地址是连续的,栈使用的是数据结构中的栈,先进后出原则,性能更快

内存分别:

堆的地址是不连续的,分配内存是在运行时确认,大小不固定,堆一般远大于栈

栈是连续的,分配内存是在编译期间,大小固定

存放的内容:

堆存放的是对象的实例和数组,更关注数据的存储

栈存放:局部变量,操作数栈,返回结果,更关注方法的执行

静态变量放在方法区,也就是线程共享,静态对象放在堆区,也是线程共享

程序可见度:

堆不仅线程共享,整个程序也共享

栈只对线程共享,是线程私有,声明周期和线程相同

队列和栈

这里讲的是数据存储,也就是数据结构中

  1. 叫法不同,栈是进栈出栈,队列是入队,出队

  1. 队列是插入在队尾,取数据在队头,栈是存取数据都在栈头,也就是队列是先进先出,栈是先进后出

对象内存分配

分配内存时并发

内存泄漏

长生命周期的对象持有短生命周期对象的引用可能引发内存泄漏,短生命周期对象已经不需要了,但是因为长生命周期对象持有对他的引用,导致不能被回收

java回收机制:

在java中不需要显式的去释放一个对象的内存,由JVM执行,有一个垃圾回收线程,低优先级,在JVM空闲和堆内存不足时,触发执行,回收那些没有被引用的实例对象,添加到回收集合中,进行回收

GC:

当创建对象时,GC开始监控对象的地址、引用和大小,GC确定一些对象不可达(可达性算法)时,会回收这些对象的内存空间,调用system.gc()通知gc运行,但不一定立马回收

引用类型

强引用:gc也不会回收

软引用:有用但不是必须存在的对象,在内存溢出之前会被回收

弱引用:有用但不是必须存在的对象,在下一次GC时会被回收

虚引用:不能通过虚引用获取对象,要通过PhantomReference实现虚引用,用途是在gc时会返回一个通知

判断对象是否可以被回收:

  1. 引用计数器,每个对象都有一个引用计数器,被引用一次+1,当前引用被释放就-1,当引用计数器=0时,可以回收,不能解决循环引用

  1. 可达性算法,从gc roots向下检索,搜索走过的路径称为引用链,当对象对应gc roots引用链上没有任何引用时,可以回收

jvm回收算法:

  1. 标记-清除法:标记无用对象,进行清除---效率不高,无法清除垃圾碎片

  1. 复制算法:按照容量一分为二,当一份用完时,将或者的对象复制到另一份,把已使用的内存情理

  1. 标记-整理:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界意外的内存

  1. 分代算法,根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代使用复制算法,老年代使用标记整理算法

类加载器:

  1. 启动类加载器 BootStrap ClassLoader 加载java核心类库,无法被java程序直接使用

  1. 扩展类加载器 extensions class loader 加载java扩展库

  1. 系统类加载器 system class loader 根据java应用的类路径加载类

  1. 用户自定义类加载器,继承ClassLoader类实现

类加载的过程:

  1. 加载,根据查找路径查找相应的class文件导入JVM的运行时区域

  1. 验证:检查加载的class文件的正确性

  1. 准备:给类中的静态变量分配内存

  1. 解析:jvm将常量池中的符号引用替换成直接应用的过程,变量类似变成对象类型

  1. 初始化:对静态变量和静态代码块进行初始化

  1. 使用、

  1. 卸载

类的加载:

将类的.class文件中的二进制数据读入到内存(运行时数据区)中,将数据放在方法区中,然后在堆区创建一个java.lang.Class对象,用来封装在方法区内的数据结构

双亲委派:任何一个类加载器收到了加载类的请求,不会自己直接加载类,而是将这个请求交给父类,如果父类能加载,就由父类加载,如果父类加载器不能加载,反馈给子类,由子类加载器加载这个类。每一层的类加载器都是这样,所以所有的加载请求都会被传递到定层的bootstrap classloader中,只有他不能加载时,才反馈给子类加载

使用Profiler和Heap dump来查看java堆空间,检查对象内存,和内存泄漏

ClassLoader源码

自定义类加载器

  1. 继承ClassLoader

  1. 重写findClass方法

  1. 重要的是二进制数据的解析

  1. 不要重写loadClass方法,破坏双亲委托

相关文章:

JVM基础学习

JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统,另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区,Native Interface 本地接口Class loader:根据给定的全限定类名来装载class文件到运行时数…...

ASML逆袭史:人、资金、技术,缺一不可

前言 近年来,由于众所周知的原因,荷兰ASML(阿斯麦)公司的先进半导体制造设备——光刻机,进入普通大众视野,成为人们茶余饭后谈论的焦点话题之一。 1月底,“美日荷三方谈判达成协议,可…...

MongoDB 覆盖索引查询

MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明: 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…...

Flink Checkpoint 中的Aligned Checkpoint 和 Unaligned Checkpoint

文章目录知识点反压CheckpointBarrierAligned CheckpointUnaligned Checkpoint核心思想实现原理UC同步阶段UC异步阶段知识点 反压 反压是流式系统中关于处理能力的动态反馈机制,并且是从下游到上游的反馈,一般是在实时数据处理的过程中,上游…...

C++快速入门

本章内容我将结合C语言一起,初步学习了解c,与大家一起快速入门这门语言。当然鉴于c本身属于一门中级语言,大家对编程有一定了解之后来学习这门知识会更加得心应手。简介C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。…...

ubuntu18.04 network有线网络图标缺失解决记录

先按照博客1安装驱动   博客1链接:Ubuntu安装 Realtek R8125 驱动_Lwang2018的博客-CSDN博客_瑞昱8125 for ubunt 安装完成后,遇到问题:ifconfig -a显示的有线网接口(名字以en开头)没有ip地址…...

java对象克隆和面向对象的设计原则

java进阶注解内置注解元注解自定义注解对象克隆浅克隆深克隆java设计模式建模语言类之间的关系依赖关系关联关系单向关联双向关联自关联聚合关系组合关系继承关系实现关系面向对象设计原则单一职责开闭原则里氏替换原则依赖倒置接口隔离迪米特原则组合/聚合复用原则注解 java注…...

传透式血氧仪设计方案

该方案一种检测方式是选择使用光敏二极管接收光信号,采用传统穿透式夹指测量;另一种是使用光谱传感器接收光信号,采用反射式测量。该传感器可将光信号直接转换成数据信息给主控端进行处理,从而节省了用户将光信号转换成模拟信号&a…...

让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

目录 代码混淆究竟是什么? 如何做代码混淆? 代码混淆不等于加密 App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时,某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推,还原成一段段…...

【拓展】基于机器学习的心脏病预测方法(14)——心脏病数据集补充

目录 前言1、数据集11.1 数据集介绍1.2 数据集属性2、数据集22.1 数据集介绍2.2 数据集属性3、数据集33.1 数据集介绍3.2 数据集属性4、下载地址前言 在实际研究过程中,前文所述数据集由于尺寸过小(仅有303份数据和13个属性信息)或数据集单一(仅有一个数据集,不具备普适性…...

深度解读Webpack中的loader原理

一、前言 webpack 是一个现代 JavaScript 应用的静态模块打包器。那么 webpack 是怎样实现不同种类资源模块加载的呢? 没错就是通过 loader。loader 用于对模块的源代码进行转换。loader 可以使你在 import 或加载模块时预处理文件。 我们带着下面几个问题&#…...

2023年全国最新二级建造师精选真题及答案

百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 1.关于法人在建设工程中的地位的说法,正确的是(&#xff0…...

为什么现代企业发展离不开CRM系统的助力

如今的CRM系统对于任何企业来说都重要,因为它能帮助企业收获新客户,保留现有客户,并且将不同部门的信息全部汇集,实时提供关于每位客户整体全面的看法。因此,销售、市场营销和客户支持等领域的客户直接服务员工能够做出…...

vb.net计算之.net core基础(1)-获取农历和天气

目录 .net core 简介创建hello,world应用程序获取天气和农历.net core 简介 .NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架。 它是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework),未来也将会支持 Free…...

设计模式之代理模式详解和应用

目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…...

JavaScript HTML DOM 节点列表

HTML DOM 是一种文档对象模型,它允许开发人员使用 JavaScript 来访问和修改网页的内容和结构。节点列表是 HTML DOM 中一个重要的概念,它允许开发人员以编程方式访问和操作文档中的节点元素。 在本文中,我们将探讨 JavaScript HTML DOM 节点…...

【音视频处理】码率、帧率越高越清晰?分辨率、像素、dpi之间是什么关系?码率的真实作用,I帧、B帧、P帧是什么

大家好,欢迎来到停止重构的频道。本期我们介绍一下视频的一些基础概念,如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。会解释多少码率是清晰的,是否帧率越高越流畅等问题。这些概念是比较杂乱的,我们按这样的顺序介…...

Java基础-认识注释、标识符关键字

注释 平时我们编写代码,当代码量较小时候,我们还可以看懂自己写的代码。但是当项目结构一旦复杂起来,我们就需要用到注释啦。注释并不会被执行,是写给我们开发者看的。 在java中的注释有三种 标识符 常见关键字 Java所有的组…...

【C#】静态扩展方法

静态类特征:1.不能用sealed或abstract修饰符;2.必须直接继承System.Object类型,不能试任何其他类的派生类;3.不能实现任何接口;4.不能包含任何操作符;5.不能使用protected或者protected internal修饰的静态成员&#x…...

医疗电子方案——血压计方案

高血压人群越来越多了,尤其是老人。高血压是一种十分常见的慢性疾病,同时也是引发心血管疾病最主要的因素。有关数据表明,我国每年因高血压死亡的病例竟然达到上百万之多,占到全部死亡比例的20%以上。所以大多数家庭都需要备有家用…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...