JVM知识点

JVM是什么

JVM(Java Virtual Machine)是 Java 虚拟机,用于运行 Java 编译后的二进制字节码,最后生成机器指令。JVM 是 Java 能够跨平台的核心

JDK,JRE,JVM三者关系

三者的关系是:一层层的嵌套关系。JDK>JRE>JVM

JVM位置

Jvm体系结构

类加载器

运行代码

public class Car {public int age;/*** 类是模板,模板是抽象(唯一)的,对象是具体的* @param args*/public static void main(String[] args) {Car car1 = new Car();Car car2 = new Car();Car car3 = new Car();System.out.println(car1.hashCode());System.out.println(car2.hashCode());System.out.println(car3.hashCode());Class<? extends  Car> aClass1= car1.getClass();Class<? extends  Car> aClass2= car2.getClass();Class<? extends  Car> aClass3= car3.getClass();System.out.println(aClass1.hashCode());System.out.println(aClass2.hashCode());System.out.println(aClass3.hashCode())}
}

结果

1237514926
548246552
835648992
939047783
939047783
939047783

双亲委派机制

寻找类加载器代码

public class Car {public int age;/*** * @param args*/public static void main(String[] args) {Car car1 = new Car();System.out.println(car1.hashCode());Class<? extends  Car> aClass1= car1.getClass();ClassLoader classLoader = aClass1.getClassLoader();System.out.println(classLoader);System.out.println(classLoader.getParent());System.out.println(classLoader.getParent().getParent());}
}

结果:

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@439f5b3d
null

从上面的结果可以看出,并没有获取到ExtClassLoader的父Loader,原因是BootstrapLoader(引导类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null

双亲委派机制过程?

最好不要重写loadClass方法,因为这样容易破坏双亲委托模式。

Native

native关键字修饰的Java方法是一个原生态方法,方法对应的实现Java作用范围达不到,而是在用其他编程语言(如C和C++)文件中实现。Java语言本身不能直接对操作系统底层进行访问和操作,但可以通过JNI接口调用其他编程语言来实现对操作系统底层的访问。

 凡是带了native关键字的,说明Java的作用范围打不到了,回去调用c语言的库,进去本地方法栈,调用本地方法接口(JNI)

JNI作用:扩展Java的使用,融合不同的编程语言为Java使用。JVM在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native方法。在最终执行的时候,通过JNI加载本地方法库的方法。

PC 寄存器

PC 寄存器用来存储指向下一条指令的地址,即将要执行的指令代码。由执行引擎读取下一条指令。程序计数器是一块较小的内存空间

方法区(Method Area)

方法区(Method Area)是所有线程共享的内存区域。

存储:静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池

堆(Heap)

一个jvm只有一个堆内存,堆内存大小可调节

类加载器读取了类文件后,一般会把  类 方法 常量 变量 保存所有引用类型的真实对象  放入堆中

堆内存=新生区(伊甸园+幸存0区+幸存1区)+养老区+永久区

垃圾回收:轻量级gc 重量级gc

主要在伊甸园区和养老区

假设内存满了,oom,堆内存不够

在jdk8以后 永久存储区改了个名字--元空间 

栈(Stack)

栈:先进后出 后进先出

队列:先进先出(fifo)

Main方法最先执行 最后结束?因为最先入栈,最后出栈

栈内存:主管程序的运行、生命周期和线程同步

线程结束 栈内存也就释放 对于栈来说 不存在垃圾回收问题

一旦线程结束,栈就结束

栈:8个基本类型+对象引用+实例的方法

栈运行原理:栈帧

栈满了:stackovererror

栈+堆+方法区

对象实例化过程

三种JVM

Sun公司 hotspot

Bea jroket

Ibm j9vm

新生区 老年区 永久区

新生区 --类:诞生、成长、死亡的地方

伊甸园:所有的类都是在伊甸园区new出来的

幸存区(0,1)

经过研究 99%的对象都是临时对象

老年区-- 新生区剩下来的 杀不死的

永久区--这个区域常驻内存,用来存放jdk自身携带的class对象 interface元数据,存储的是Java运行时的一些环境或类信息不存在垃圾回收  关闭jvm会释放区域的内存

一个启动类加载大量第三方jar包 tomcat部署了太多应用 大量动态生成反射类,不断的被加载  -----oom

Jdk1.6之前 永久代 常量池在方法区

Jdk1.7 永久代 但慢慢退化了 区永久代 常带吃在堆中

Jdk1.8以后 无永久代 常量池在元空间

 

 

  1. 堆内存调优

在一个项目中 突然出现了oom故障 该如何排除 研究为什么出错

能够看到代码第几行出错:内存快照分析工具 mat  jprofilter

 mat  jprofilter作用

-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

Debug一行行分析代码

Gc垃圾回收

只能自动回收 在进行回收时大部分时候 回收在新生代

新生代

幸村区(from  to)

老年区

Gc两种类 轻gc 中gc

引用计数法一般不采用 不高效

复制算法 谁空谁是to

好处:没有内存碎片

坏处:浪费了内存空间  多了一般空间永远都是to 假设对象100%存活(极端情况)

适合使用场景:对象存货度较低(新生代)

标记清除算法

优点:不需要额外的空间

缺点:两次扫描,严重浪费时间,会产生内存碎片

标记压缩 防止内存碎片产生 再次扫描 向一端移动存货的对象多了一个移动成本

总结

内存效率 复制算法>标记清除>标记压缩

内存整齐度 复制算法=标记压缩 >标记清除

内存利用率 标记清除=标记压缩>复制算法

难道没有最优算法吗  没有最好的 只有最合适的 --->gc分代收集算法

JMM java memory model

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

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

相关文章

第26讲:Ceph集群OSD扩缩容中Reblanceing数据重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

护理考试搜题软件哪个免费?分享九个搜题直接出答案的软件 #知识分享#微信

培养自己的阅读习惯&#xff0c;并不仅仅限于课外读物&#xff0c;还包括学术期刊、行业报告等&#xff0c;以不断提升自己的知识水平和思考能力。 1.彩虹搜题 这是一个公众号 是一款专门针对于大学生或者是成年自考等学生顺利完成证件考试的应用软件&#xff0c;这款软件涵…

详细介绍 CNN 完成 CIFAR 图像分类任务

准备工作 这里用到的是&#xff1a; tensorflow-cpu 2.4 版本python 3.8 版本anaconda 自带的 jupyter notebook 本文大纲 加载、展示、处理 CIFAR 图像数据搭建 CNN 模型架构编译、训练模型测试模型 加载、展示、处理 CIFAR 图像数据 &#xff08;1&#xff09;这里国内…

一.iOS核心动画 - 关于图层与视图

引言 Core Animation听起来会让人误以为它只是用来做动画的&#xff0c;但是事实上它是从Layer Kit库演变而来的&#xff0c;其中做动画的功能只是Core Animation特性的一小部分。 Core Animation是一个复核引起&#xff0c;它的作用就是尽可能快地组合屏幕上不同的显示内容&…

Python | Leetcode Python题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution:def reorderList(self, head: ListNode) -> None:if not head:returnmid self.middleNode(head)l1 headl2 mid.nextmid.next Nonel2 self.reverseList(l2)self.mergeList(l1, l2)def middleNode(self, head: ListNo…

18.2 HTTP服务器-处理函数、响应404错误

1. 处理函数 处理来自客户端的请求&#xff0c;并回之以特定的响应&#xff0c;这是处理函数的主要任务。在处理函数中&#xff0c;我们通常会完成如下工作&#xff1a; 验证请求路径 http.Request.URL.Pathhttp.NotFound(...) 当请求没有对应的处理函数时&#xff0c;返回4…

Vue3【十六】TS中的接口、泛型,自定义类型

Vue3【十六】TS中的接口、泛型&#xff0c;自定义类型 TS中的接口、泛型&#xff0c;自定义类型 案例截图 目录结构 代码 app.vue <template><div class"app"><h1>你好世界! 我是App根组件</h1><Person /></div> </templat…

OpenAI官方Prompt工程指南详解!再也不怕写不好Prompt了!

使用AI聊天、AI写作、还是AI绘图等过程中Prompt具有重要意义。 那么Prompt要怎么写效果才好&#xff1f;有没有标准化的模板可以直接用&#xff1f; 有&#xff0c;OpenAI官方发布了一份提示词工程指南&#xff0c;该指南分享了6大策略即可让AI输出更好的结果。至此&#xff…

无线领夹麦克风哪个品牌性价比高?推荐领夹麦克风性价比最高品牌

当今的直播、短视频已经深深的融入到了我们的生活当中&#xff0c;很多小伙伴会通过拍摄短视频、Vlog来分享自己生活精彩的瞬间。不过录制视频时&#xff0c;如果单纯靠手机拾音&#xff0c;距离手机越远&#xff0c;声音越小越不清晰如果有噪音干扰&#xff0c;那更是“惨不忍…

ONVIF相关介绍

ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同厂商生产的网络视频产品具有互通性。2008年11月,论坛正式发布了ONVIF第一版规范——ONVIF核心规范1.0。随着视频监控的网络化应用,产业链的分工将越来越细。有些厂商专门做摄像头…

pytest中失败用例重跑

pip install pytest-rerunfailures 下载rerunfailures插件包 配置文件中加入命令 --reruns 次数 也可在命令行中pytest --rerun-failures2 可以在allure报告中看到重试效果

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示&#xff1a; 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…

C++:SLT容器-->queue

C:SLT容器-->queue 1. queue容器2. queue 常用接口 1. queue容器 先进先出队列允许从一端插入元素&#xff0c;从另一端删除元素队列中只有队头和队尾可以被外界使用&#xff0c;因此队列不允许有遍历行为队列中插入数据称为入队(push)&#xff0c;删除数据称为出队(pop) …

JS 实现动态规划

function getPaths(m, n) {// m * n 二维数组&#xff0c;模拟网格const map new Array(m)for (let i 0; i < m; i) {map[i] new Array(n)}// 如果只走第一行&#xff0c;就只有一条路径。所以第一行所有 item 都填充 1map[0].fill(1)// 如果只走第一列&#xff0c;也只有…

【vue3|第8期】深入理解Vue 3 computed计算属性

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

合约ABI探秘

EOA使用ABI调用 合约之间使用接口调用 自己写ABI&#xff0c;自己写接口 ABI探秘 EOA使用的ABI数据与合约间调用时调用者持有的接口时等价的&#xff0c;都是对合约函数签名的完整描述调用者使用ABI数据生成message中的calldata message上下文的变化 合约之间的调用也模拟…

8.11 矢量图层线要素单一符号使用六(光栅线)

文章目录 前言光栅线&#xff08;Raster Line&#xff09;QGis设置线符号为光栅线&#xff08;Raster Line&#xff09;二次开发代码实现光栅线&#xff08;Raster Line&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中光栅线&#xff08;Raster Line&#xff09;的使…

如何通过加密U盘 实现数据传输闭环管控?

加密U盘是用来保护存储在其中数据的安全的。通过加密技术&#xff0c;用户可以将其敏感文件和信息存储在U盘中&#xff0c;并设置密码或使用其他加密方法来防止未经授权的访问。这种安全措施可以防止数据泄露或盗窃&#xff0c;特别是在丢失或被盗的情况下&#xff0c;确保数据…

机床联网第一课

一、不是废话的废话 照例第一篇文章先介绍下整个专栏系列的内容和背景&#xff0c;这篇文章不涉及任何代码和技术知识&#xff0c;大家都能看得懂。 1、写作初衷 自入行接触设备数据采集、设备联网工作近十年&#xff0c;期间记不清有多少次有人请我帮忙去处理公司外部的项目&…

软件下载网站源码附手机版和图文教程

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程&#xff0c;可以做软件库&#xff0c;也可以做推广app下载等等&#xff0c;需要的朋友可以下载 源码下载 软件下载网站源码附手机版和图文…