一流程序员与二流程序员的分水岭:JVM虚拟机-全面理解

萨瓦迪卡6个月前 (09-22)jvm3337

秉承一个信念,要学遍学底层逻辑。那是一通百通的底气。

一、学不学JVM 是自主解决问题的一流程序员与跟着别人做CRUD的二流程序员的分水岭。只有深入了解透彻jvm的工作过程及原理,才能对自己开发出高性能的代码充满信心。

二、JVM虚拟机的本质将class文件转换成操作系统具体的指令。
一个java文件从编写到执行的过程:通过javac将java文件编译成一个class文件交给虚拟机,虚拟机的工作过程如图:


d486157c-7b0e-44f5-a572-119c6318f819.png

1首先就是将classFile文件通过类加载(ClassLoader也就是个类)加载到jvm虚拟机的内存中。就是将类加载到就是方法区(元数据区)

2然后交给执行引擎,将类中指令解析出来执行,执行过程中会将类创建对象。

3再将对象创建到堆当中。

那要执行某个东西需要一个逻辑就是线程。因为只有线程是执行程序的唯一单元。在jvm内部,会对每一个线程分配一个虚拟机栈(左数第2列),它是一个先进后出的栈结构。在这个栈里面会记录当前线程运行的所需要的数据。


栈(线程):存放局部变量。只要有一个线程运行主方法,jvm马上会在线程栈内一大块内存 给当前线程分配一小块独立的内存空间,用来放线程运行中 这些局部变量。(一个线程内有多个方法)
虚拟机栈(线程私有)核心包括:
   栈帧(会为每个方法创建一个专属的内存空间,也就是创建一个栈帧,它把一个线程内的不同的方法内存给隔离开来),栈帧又包含:
局部变量表:存放每个方法里的局部变量
        操作数栈:就是我们的操作数,在程序运行过程中它要做操作的临时的中转 存放的内存空间
局部变量表和操作数栈,这两个是执行java文件最基础的数据结构,记录我要执行这个方法需要多少的内存。局部变量对应的操作数。
        动态链接库:是指向方法区的哪个方法
动态链接是:把符号引用 (常量池的符号)转为 直接引用 (直接地址)。这些符号,程序加载的时候不会解析,main方法会解析,但方法  是在程序运行的时候 需要找到这些符号的代码       (把这些符号转换成代码的直接内存地址)  解析的。这就是调动态链接。)
         返回地址(方法出口):执行完返回到哪里
方法出口:方法执行完,要回到哪个地方去。比如:main()里的,Math math = new Math();一般来说new一个对象是放在堆里面,那main()的局部变量表是 有个math的,这个math存的是给他分配的对象在堆里面内存地址。)
附加信息:jvm自己实现时附带的信息。

   每一个线程中都有一个 程序计数器:记录当前线程运行到哪一步了。


执行引擎:具体执行过程中,后很多执行方式,包括:解释执行、编译执行。编译执行又分为C1和C2(默认)两种。

类在元数据区,对象在堆区。
栈和堆的关系:栈里面有很多的局部变量, 栈里面放的都是这些对象在堆里面的内存地址。
方法区和堆的关系:我方法区如果有很多静态变量,其中有些静态变量是对象,放的是堆里面的内存地址。
栈、本地方法栈、程序计数器,是每个线程独有的。

堆和方法区 是所有的线程共享的内存区域。


image.png

堆:分为年轻代、老年代。对象一般会放在eden区。

假设有一个web7*24小时运行,当堆里eden区对象放满的时候,会触发垃圾收集gc(minor gc ):就是把无用的对象回收一下。找到非垃圾对象,放到survior区,剩下的干掉。如果一个对象经历过一次gc之后,分代年龄会加1.当分代年龄加到15,会被挪到老年代。


如果老年代放满了,它会触发full gc,它回收的是整个堆以及方法区。那如果有些老年堆里的对象被gc root引入了,回收不了,那就没有新的空间放新的对象,这时会触发OOM.在整个gc的过程中,可能会触发一个 STW机制(stop the word),停止用户线程。STW就是在gc时,会停掉用户的所有线程。用户会感到卡顿了一下,那SWT会对网站的性能有一定的影响的。


什么样的对象最终会别挪到老年代?静态变量对象、缓存对象、spring容器内的对象。

JVM的主要目的就是减少full gc,或者是减少full gc 的时间。因为在full gc的时候收集堆的时间比较长,所以它STW的时间相对也比较长。当然也要减少minor gc的次数。


二、Class 文件规范

1、Class文件结构

实际上,我们需要了解的是,Java 官方实际上只定义了JVM的一种执行规范,也就是class文件的组织规范。理论上,只要你能够写出一个符合标准的class文件,就可以丢到 JVM 中执行。至于这个class文件是怎么来的,JVM 虚拟机是不管的。这也是 JVM 支持多语言的基础。
这个规范到底是什么样子呢?当然,你可以直接去看 Oracle 的官方文档。JDK8 的文档地址:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 。后面也会有文章详细分析每一个字节。这里,我们只抽取主体内容。
比如,对于一个ByteCodeInterView.class文件,可以用 UltraEdit 工具打开一个class文件,看到的内容部分是这样的:

6d7ad69d-9884-463a-b89d-84fd381a0b6b.png

中间这一部分就是他的二进制内容。当然这是十六进制的表达。空格隔开的部分代表了 8 个bit,而每一位代表的是 4 个 bit字节,也就是一个十六进制的数字。例如 第一个字母 C 就表示十六进制的 12二进制是 1100。而所有的class文件,都必须以十六进制的 CAFEBABE 开头,这就是 JVM 规范的一部分。这也解释了 Java 这个词的由来,到底是一种咖啡,还是爪哇岛。

Spring6及springboot3已经用到jdk17了,但是我们jdk8 是跑不起来spring6的。

后面的部分就比较复杂了,没法直接看。可以用 javap指令可以直接来看一些class文件。比如:

b1b8939c-e33d-4fe1-aaa0-bc7815e81692.png

还是不容易查看或看懂,可以安装并使用插件:jclasslib Bytecode viewer图形化查看:

950429fd-f774-4ab9-aef7-bbe18e9a6f19.png

可以看到jvm的字节码,以及整个的执行过程:

6397a883-696f-494c-a12b-fdfa96d48ccc.png6397a883-696f-494c-a12b-fdfa96d48ccc.pngd9003aee-6ee3-4f2b-93ce-6231b23bbbe0.png

再就是LineNumbertable这里,说明第10行代码执行的 0到6的指令。

image.png

本文原创,转载必追究版权。

分享给朋友:

相关文章

js限制input只能输入数字、英文、汉字

 1.只能输入数字和英文的:  <input onkeyup="value=value.replace(/[\W]/g,'') "...

java将金额转化为大写金额

 private static String[] num = {"零","壹","贰","叁","肆...

MyEclipse 10 性能大优化

MyEclipse 10 性能大优化

 MyEclipse 10已发布,新版本的特性能够大大提高开发者的效率。但同时,由于电脑配置的原因,很多开发者在使用MyEclipse的时候,速度都不是很快,需要我们对MyEclipse进行...

坑爹的ShowModalDialog 后台传值解决方案

 今天遇到需要ShowModalDialog打开页面,通过acceptanceIds 参数值后台过滤出相应结果前台  var url = "loadAccept...

freeMarker Jfinal 获取session里的值

问题:freeMaker session取值的常用格式都试过 session["xxx"],session.xxx 直接xxx 都取不出来?????解决:JFinal与Struts...

jquery 操作html元素(及CSS)

jquery 操作html元素(及CSS)

 $("li").addClass("aui-user-view-cell aui-img") ;  //给元素添加样式$('#a1...

评论列表

quickq
4个月前 (12-20)

顶一下,收藏了!https://www.quickq9.com

QuickQ
3个月前 (12-22)

观点鲜明,立场坚定,作者态度明确。https://www.quickq9.com

quickq电脑版
3个月前 (12-29)

看帖不回帖的人就是耍流氓,我回复了!https://www.quickq9.com

2trx能量租赁
3个月前 (12-29)

TRX能量租赁 - 2 TRX=1次转账次数 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 2 TRX即可0手续费转账!TG机器人频道:@xingtahttps://t.me/xingta

0.8trx能量租赁
3个月前 (12-31)

TRX能量租赁 - 2 TRX=1次转账次数 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TAZdAh5LU55aUPPZkgF4rupQwg6inQ5J5X】转 2 TRX即可0手续费转账!TG机器人频道:@xingtahttps://t.me/xingta

quickq电脑版
3个月前 (01-03)

楼主是在找骂么?https://www.quickq9.com

WPS官网
1个月前 (03-04)

一口气看完了,我要下去回味回味了!https://www.p-wps.it.com

有道翻译下载
1个月前 (03-04)

楼主说的我也略懂!https://fanyi-youdao.it.com

谷歌浏览器
1个月前 (03-04)

在哪里跌倒,就在那里多爬一会儿!https://www.cn-chrome.it.com

wps
1个月前 (03-04)

今天的心情很不错啊https://pcs-wps.cn

有道翻译下载
1个月前 (03-05)

最近回了很多帖子,都没人理我!https://www.youdao-zh.it.com

helloworld官网
1个月前 (03-05)

支持一下!https://www.web-helloworlds.net

有道翻译下载
1个月前 (03-05)

楼主今年多大了?https://www.youdao-win.it.com

有道翻译
1个月前 (03-05)

太高深了,理解力不够用了!https://youdao-fanyi.it.com

快连VPN
1个月前 (03-05)

楼主是一个典型的文艺青年啊!https://vpn-kuailian.it.com

快连VPN下载
1个月前 (03-06)

这里的资源非常丰富,帮助我解决了很多问题。https://kuailian-vpn.it.com

helloworld官网
1个月前 (03-06)

看了这么多帖子,第一次看到这么经典的!https://vip-helloworld.cn

helloworld官网下载
1个月前 (03-06)

世界末日我都挺过去了,看到楼主我才知道为什么上帝留我到现在!https://www.mac-helloworlds.cn

快连VPN官网
1个月前 (03-06)

吹牛的人越来越多了!https://web-kuailian.it.com

有道翻译官网
4周前 (03-06)

论坛的人气越来越旺了!https://www.win-youdao.it.com

helloworld
4周前 (03-06)

看了这么多帖子,第一次看看到这么有内涵的!https://www.app-helloworlds.cn

WPS
4周前 (03-06)

雷锋做好事不留名,都写在帖子里!https://c-wps.it.com

helloworld下载
4周前 (03-07)

论坛人气好旺!https://www.cm-helloworlds.cn

有道翻译官网
4周前 (03-07)

楼主是我最崇拜的人!https://cn-youdao.it.com

有道翻译
4周前 (03-07)

很有看点!https://fanyi-youdao.it.com

WPS
2周前 (03-23)

收藏了,怕楼主删了!https://www-wps-cn.com

WPS
2周前 (03-23)

这个帖子好无聊啊!https://i-wps.it.com

helloworld
2周前 (03-23)

不灌水就活不下去了啊!https://org-helloworlds.org

搜狗输入法下载
2周前 (03-23)

大神好强大!https://im-sogou.com

helloworld官网
2周前 (03-24)

网页的加载速度非常快,不会影响用户体验。https://www.co-helloworld.com

搜狗官网
2周前 (03-24)

怎么我回帖都没人理我呢?https://im-sogou.com

WPS下载
2周前 (03-24)

看帖不回帖的人就是耍流氓,我回复了!https://w-wps.it.com

WPS官网
2周前 (03-24)

青春不在了,青春痘还在!https://www.wps-web.it.com

有道翻译下载
2周前 (03-24)

很给力!https://i-youdao.com.cn

WPS下载
2周前 (03-24)

突然觉得楼主说的很有道理,赞一个!https://www.wps-win.it.com

有道翻译下载
2周前 (03-24)

感谢楼主的推荐!https://i-youdao.com.cn

wps下载
2周前 (03-24)

看帖不回帖都是耍流氓!https://www-wps-cn.com

有道翻译在线
2周前 (03-25)

看帖不回帖都是耍流氓!https://i-youdao.com.cn

WPS
2周前 (03-25)

支持一个https://www.w-wps.it.com

wps下载
2周前 (03-25)

好东西,学习学习!https://www-wps-cn.com

有道翻译在线
2周前 (03-25)

大神就是大神,这么经典!https://i-youdao.com.cn

wps下载
2周前 (03-25)

帖子很有深度!https://www-wps-cn.com

有道翻译官网
2周前 (03-25)

看了这么多帖子,第一次看到这么有深度了!https://i-youdao.com.cn

有道翻译官网
2周前 (03-25)

楼主人气很旺!https://i-youdao.com.cn

tronlink
2周前 (03-25)

USDT-trc20免费转账 - 1.5 TRX=1次转账次数 直接节省80%!无视对方有没有U或者是否交易所- 复制地址【TWzHTvfWZrraadP2VwKZRi3X14aAedKSC4】转 1.5 TRX即可0手续费转账!TG机器人:@nengliang_robot

有道翻译在线
2周前 (03-25)

今天是个特别的日子,值得纪念!https://i-youdao.com.cn

WPS
1周前 (03-26)

雷锋做好事不留名,都写在帖子里!https://www-wps-cn.com

1.5trx转账
1周前 (03-26)

trx手续费 - 2 TRX=1次转账次数 直接节省80%!无视对方有没有U或者是否交易所,低于 2 TRX的都是钓鱼的骗子- 复制地址【THXfhfV6ThhYzt7d8mm4KL3dE5LWBbwb3s】转 2 TRX即可0手续费转账!TG机器人: @jzzTRXbot 官网: https://jzztrx.com

有道翻译在线
1周前 (03-26)

好无聊啊!https://i-youdao.com.cn

有道翻译下载
1周前 (03-26)

楼上的这是啥态度呢?https://i-youdao.com.cn

wps下载
1周前 (03-27)

楼主很有激情啊!https://www-wps-cn.com

搜狗官网
1周前 (03-27)

楼主是男的还是女的?https://im-sogou.com

有道翻译下载
1周前 (03-27)

世界末日我都挺过去了,看到楼主我才知道为什么上帝留我到现在!https://i-youdao.com.cn

helloworld
1周前 (03-27)

这么好的帖子,应该加精华!https://www.org-helloworld.com

helloworld官网
1周前 (03-27)

楼主加油,看好你哦!https://www.mace-helloworlds.com

wps下载
1周前 (03-27)

好东西,学习学习!https://www-wps-cn.com

搜狗输入法
1周前 (03-27)

这位作者的文笔极其出色,用词精准、贴切,能够形象地传达出他的思想和情感。https://im-sogou.com

WPS
1周前 (03-28)

楼主很有艺术范!https://www-wps-cn.com

有道翻译
1周前 (03-28)

楼上的真不讲道理!https://i-youdao.com.cn

WPS
1周前 (03-28)

楼主是一个典型的文艺青年啊!https://wps-win.it.com

wps下载
1周前 (03-28)

楼主的文笔不错!https://www-wps-cn.com

helloworld下载
1周前 (03-28)

这个帖子好无聊啊!https://co-helloworlds.net

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。