JVM基础学习

news2025/2/27 11:12:55

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方法,破坏双亲委托

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

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

相关文章

借助docker, 使用verdaccio搭建npm私服

为何要搭建npm私服 搭建npm私服好处多多,网上随便一篇教程搜出来都罗列了诸多好处,譬如: 公司内部开发环境与外网隔离,内部开发的一些库高度隐私不便外传,内网搭建npm服务保证私密性同属内网,可以确保使用npm下载依赖…

RPC技术选型

前言HTTP1.0 & HTTP1.1 & HTTP2.0 & RPCHTTP1.0无法复用连接HTTP1.0 协议时,HTTP 调用还只能是短链接调用,每次发送请求的时候,都需要进行一次TCP的连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网…

金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~

JAVA面试撸题就来【笑小枫】微信小程序啦~ 疫情已过,金三银四即将到来,小伙伴们是否有跳槽的打算呢?不管有没有,技术不能丢,让我们一起来撸题吧。 博主最近整理了一批面试题,包括JAVA基础、多线程与锁、Red…

媒体邀约电视台对商业活动选题有什么要求?如何邀请电视台报道

传媒如春雨,润物细无声,大家好随着互联网,移动互联网的快速发展,大众在电视上消磨的时间就越来越短了,但是随着新媒体的出现,传统媒体不断的跟进发展,不断打造自己的媒体矩阵,虽然离…

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(一)

DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…

图穷了,来搞一搞(内附源码)

本章继续我们的爬虫教程,爬什么呢 ,还是斗图,娱乐性的东西,为什么要爬? 因为我图库空了,发现这个网址的图库还是很丰富的。 「注意:如下文,是封装后拆分的,所以详情参照…

Word处理控件Aspose.Words功能演示:使用 C# 在电子邮件正文中发送 Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外,API支持所有流行的Word处理文件…

《精通Spring4.x 企业应用开发实战》第12章 Spring 的事务管理难点剖析

目录标题前言一、DAO 和事务管理的牵绊二、应用分层的迷惑三、事务方法嵌套调用的迷茫(事务传播行为)1.Spring 事务传播机制回顾2.相互嵌套的服务方法四、多线程的困惑1. Spring 通过单实例化 Bean 简化多线程问题2.启动独立线程调用事务方法五、联合军种作战的混乱1.Spring 事…

用了 ChatGPT 后,我迫不及待的问了它这 10 个问题

前言20230208 日,ChatGPT 已经联手微软登录必应搜索引擎,谷歌、百度等巨头更是紧随其后着急麻慌的推出自己的 AI 聊天产品,有理由相信,传统搜索引擎时代已经结束,不远的未来,每个人家里都会有一个可以陪你聊…

数字芯片是怎样设计出来的?

芯片在我们的生活和工作中无处不在。例如,交通智能卡就嵌入了一颗带有微处理器、储存单元、芯片操作系统的芯片;而手机的主板则集成了数百颗芯片,有的负责无线电收发、有的负责功率放大、还有的负责存储照片和文件、处理音频,完成…

如何查找专用 IP 地址?

专用 IP 地址:这些地址在网络内部使用,例如,平板电脑、Wi-Fi 相机、无线打印机和台式电脑使用的家庭网络。这些类型的 IP 地址为设备提供了一种与路由器和专用家庭网络上的其他设备进行通信的方法。私有IP地址可以手动设置,也可以…

Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期

Kubernetes之Pod生命周期Pod生命周期官方文档Pod的状态初始化容器案例钩子函数Exec命令TCPSocketHTTPGet案例容器探测Exec命令TCPSocketHTTPGet探测时间重启策略Pod生命周期官方文档 Pod生命周期官方文档 Pod的状态 pending:挂起,apiserver创建了pod资…

2月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年2月6日-2月12日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营能力强的B站…

python基于django+vue微信小程序的校园跑腿平台

随着计算机技术的高速发展,现代计算机系统已经从以计算为中心向以信息化处理为中心的方向发展。而校园跑腿服务系统,不仅需要在硬件上为现代社会的学生们提供一个学习知识,获取知识的环境,更要在软件上为愿意上课的人提供必要的便利。于是校园跑腿服务系统系统便应运而生。 目前…

企业与第三方供应商合作时,会存在哪些安全风险?

随着现代社会的发展,企业供应链、产业供应链已日渐成熟。其中,供应商与企业的关系也由最初的纯粹买卖关系发展成了合作伙伴关系。在整个供应链体系中,供应商与其受众承担着供应链中环环相扣的责任,可以说,企业安全的薄…

站在行业C位,谷医堂打开健康管理服务新思路

对于农村及贫困地区老百姓来说,由于交通因素和家庭经济条件制约,看病难致身体调理情况一直不太乐观,这也导致心理压力很大。然而,随着近年中医药产业崛起与快速发展,这种局面很快就会得到改观,以湖南谷医堂…

MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是不是准确的,或者data free是不是可以参…

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

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

【MySQL】数据库操作

文章目录1、创建和管理数据库1.1 创建数据库1.2 查看数据库1.3 修改数据库1.4 删除数据库2、 创建表2.1 创建表CREATE2.2 创建表AS3、修改表3.1 添加列 ALTERT TABLE ADD3.2 修改列 ALTER TABLE MODIFY3.3 重命名列 ALTER TABLE CHANGE3.4 删除列 ALTER TABLE DROP4、重命名表 …

一文讲透丨如何破解安全应用容器架构的17大挑战!

众所皆知,云计算/云原生技术因能极大地提高云上资源利用率以及应用交付效率而被广泛采用。然而,云计算/云原生技术的发展也让用户遭受了更多高级威胁与攻击。如何构建有效的云原生安全管理体系应对层出不穷的安全威胁这一问题也一直受到千行百业用户的关…