浅聊JVM--基础版

这篇具有很好参考价值的文章主要介绍了浅聊JVM--基础版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅聊JVM--基础版

一、来源


jvm共有三种

  • Sun公司: HotSpot使用最多
  • BEA:JRockit
  • IBM:J9VM

​ 今天我们主要了解的是Sun公司的HotSpot(关于HotSpot的爱恨情仇这里就不做过多解释了。)我们以前测试jdk是否安装成功,java的环境变量是否配置成功会使用java -version命令来检查。有一个细节大家可以看一下,cmd输入java -version回车后,可以查看jvm。上图

浅聊JVM--基础版

​ 大家可以看到,我们目前使用大都是Sun公司的产品。那么jvm处于什么位置呢?其实jvm是在操作系统之上,和硬件并无直接联系。

浅聊JVM--基础版

面试题:jvm、jdk、jre的区别?

二、概述


​ JVM是Java Virtual Machine的缩写,通俗来说也就是运行Java代码的容器。当项目启动时,会根据jvm相关配置参数,在计算机的内存中开启一片空间用于运行jvm,之后Java相关代码就会被加载进jvm中运行。那么为什么Java代码可以实现“一次编译,到处运行”的机制应该就与jvm有关了吧。

Java作为一种高级语言,要让计算机执行Java程序,也得需要经过编码-->编译-->运行步骤。但是Java编译程序并不能将Java源代码直接编译为计算机能识别的0/1指令,而是编译为字节码文件(.class)这时候就需要jvm将字节码文件翻译为与平台有关的0/1指令。所以有了jvm,Java程序就达到了“一次编译到处运行”的目的。所以其跨平台好的根本原因就是因为jvm的存在。但是JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

​ 它的内存空间包括方法区、堆、方法栈、本地方法栈、PC寄存器。(以上5块又成为运行时数据区)。我们刚才也提到,Java源代码经过Java编译程序。能够产生相应的.class文件,也就是字节码文件。字节码文件经过jvm中的解释器,再次编译成特定机器上的机器码指令。上图:
浅聊JVM--基础版

关于类加载器是如何工作的,大家可以参考文章:

[Java 类加载和类加载器 - 掘金 (juejin.cn)](https://juejin.cn/post/7226665757882236986)

面试题:什么是双亲委派原则?

面试题:JNI(Java Native Interface)Java本地方法接口中Native关键字的作用?

我们今天主要浅聊一下PC寄存器、方法区、栈、堆

三、PC寄存器


​ 程序计数器(Program Count Register):每个线程都有一个程序计数器,它是线程私有,是用来存储指向下一条指令的地址,也就是即将来执行的指令代码。在执行引擎读取下一条指令,是一个非常小的内存空间。(关于程序计数器更多的细节或者是在循环、判断等条件下PC是如何跳转的,大家可以参考《计算机组成原理》类资料了解更多底层原理。)

四、方法区


​ 方法区(Method Area):只是 JVM 规范中定义的一个概念,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。具体放在哪里,不同的实现可以放在不同的地方。HotSpot VM把 GC 分代收集扩展至方法区,即使用 Java 堆的永久代来实现方法区。(关于什么是永久代,请向下看)

面试题:一张白纸,画出对象实例化过程的内存图?

五、栈


​ 栈(Stack):里面放的是8大基本数据类型+对象引用+实例的方法。栈内存里,主管程序的运行,生命周期和线程同步,线程结束,栈内存也就释放了,栈内存结束,程序也就结束了。

​ 我们都知道在Java中,程序员不需要显示的去释放一个对象的内存的,而是由虚拟机自行回收垃圾,那么垃圾回收的过程不会涉及到栈(也就是说栈不存在垃圾回收的情况)

栈基于后进先出的特性,当执行完成后,会被弹出栈。

为什么main()是先执行,最后结束?(因为一开始是main()方法最先入栈,最后弹出,结束执行)

栈溢出的问题(StackOverflow)

看下一面一段程序:
浅聊JVM--基础版

浅聊JVM--基础版

jvm中的栈为:

浅聊JVM--基础版

六、堆


​ 堆:(Heap)运行时数据区,是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行 垃圾收集的最重要的内存区域。堆内存细分为3个区域:

  • 新生区(伊甸园去)--->Young/New(Eden Space)
  • 养老区(Old)
  • 永久区(Perm)

浅聊JVM--基础版

新生区又可以分为伊甸园区(Eden Space)、幸存0区、幸存1区,(幸存0区又可以称为SurvivorFrom区、幸存1区可以称为SurvivorTo区。From区和To区是可以来回动态交换的,具体什么原因,大家可以查阅资料)

伊甸园区:所有的对象都是在伊甸园区new出来的。

幸存者(0、1)区:在伊甸园区里经过一次轻GC后活下来的进入幸存(0、1)区,被清理掉的就死亡掉。(关于GC是如何进行垃圾回收的,大家可以自行查阅资料,这里只是简单了解)

养老区:在经过多次的轻GC处理后,幸存(0,1)区也都满了,会触发重GC来进行清理伊甸园区和幸存(0,1)区,那么进入养老区的就是重GC也未杀死的。若养老区也满了,就相当于内存已满,报OOM错误(java.lang.OutOfMemoryError:Java heap sapce)

浅聊JVM--基础版

听闻:99%的对象都是临时对象,能进入养老区的不多,所以OOM的错误也很少见。

面试题:工作中,遇到OOM了,你是怎么排查的?

1、尝试扩大堆内存空间,如果还满,可能有垃圾代码存在

2、分析内存,使用专业工具看哪里出了问题

[面试官:工作中遇到过 OOM 吗?你是怎么排查的? - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/165981061)

扩大内存空间参数:

浅聊JVM--基础版

(具体的参数设置大家自己查阅)

例如:
浅聊JVM--基础版

永久区:这个区域常驻内存,用来存放JDK自身携带的Class对象,Interface元数据,存储的是java运行时的一些环境或类信息,该区域不存在垃圾回收GC。关闭虚拟机就会释放这个内存。

关于永久区的更新换代:

jdk1.6之前:永久代,常量池在方法区

jdk1.7:永久代,但是慢慢退化了(去永久代)常量池在堆中

jdk1.8之后:无永久代,常量池在元空间
浅聊JVM--基础版

方法区又称非堆,本质还是堆,只是为了区分概念。

浅聊JVM--基础版

OK,结束!!!

资料参考:

狂神说Java

JVM入门笔记文章来源地址https://www.toymoban.com/news/detail-435797.html

到了这里,关于浅聊JVM--基础版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP的curl有三种Post请求数据的方式

    今天要讲的HTTP请求头的Content-Type字段,就是在curl发送post请求的时候需要指定以何种方式来请求数据,常用的有3类: 1、form-data 。就是 multipart/form-data 使用表单的方式来发送数据 是curl采用的默认发送方式。请求数组类型的格式。 Content-Type: multipart/form-data 2、x-www-form-urlenco

    2024年02月11日
    浏览(76)
  • 使用maven打包时如何跳过test,有三种方式

    方式一 针对spring项目: 针对springboot:  方式二(通用 ): 方式三(通用): mvn package -DskipTests=true -DskipTests=true,不执行测试用例,但编译测试用例类生成相应的class文件至 target/test-classes 下。   mvn package -Dmaven.test.skip=true -Dmaven.test.skip=true,不执行测试用例,也不编译测试

    2024年02月13日
    浏览(41)
  • 云计算,主要有三种服务模式:IaaS、PaaS、SaaS的区别

    云计算,主要有三种服务模式,它们分别是IaaS、PaaS、SaaS,那么他们之间到底有什么区别和联系呢?今天数合宙就带大家一探究竟。 01 云计算服务类型介绍 云计算服务:指可以拿来作为服务、提供使⽤的云计算产品。包括云主机,云空间,云开发,云测试和综合类产品等。

    2024年02月01日
    浏览(56)
  • 标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:JVM 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想要的

    2024年02月13日
    浏览(41)
  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 继承Thread类、实现Runnable接口和使用线程池。 但是,你们知道吗?

    2024年02月08日
    浏览(71)
  • 荣耀magicbook重装系统后,指纹不能录入的情况,有三种解决办法,完美解决问题。

    有些小伙伴用了很多年的荣耀的笔记本还没坏,但是用着很卡,就想着重装windows系统,系统是重装完了,但是发现指纹录入不上了,就像下面这样,手指放在感应器上也不管用。 本人电脑是2018年买的,已经是过了保修期了,咨询了客服,检测是不需要自己掏钱的,但是如果

    2024年02月02日
    浏览(40)
  • Verilog的三种描述方式(结构化描述、数据流描述、行为级描述对电路功能的描述有三种方式:结构化描述、数据流描述、行为级描述

    Verilog的三种描述方式(结构化描述、数据流描述、行为级描述对电路功能的描述有三种方式:结构化描述、数据流描述、行为级描述。三种描述方式抽象级别不同,各有优缺点,相辅相成,需要配合使用。 目录 一、结构化描述 1、概念 2、特点 3、示例 真值表: 电路抽象:

    2024年02月04日
    浏览(67)
  • JVM中释放内存的三种方法

    判断是否需要垃圾回收可以采用分析。 1标记--清除算法 分为两个阶段,标记和清除,先利用可达性分型标记还存活的对象,之后将没有被标记的对象删除,这样容易生成空间碎片,而且效率不稳定 标记阶段: 标记阶段与可达性分析算法类似,通过从根对象开始遍历对象引用

    2024年02月12日
    浏览(69)
  • 三种方式查看 JVM 垃圾收集器

            不同版本的 JVM 默认使用的垃圾收集器是不同的,目前的新生代和老年代的垃圾收集器如下图所示,新生代和老年代之间的连线表示这些垃圾收集器可以进行搭配使用         垃圾收集器的名字和  JVM 里面的参数对照表如下,即在 JVM 里面并不是存储的垃圾收

    2024年02月09日
    浏览(45)
  • ISO26262功能安全硬件指标计算实践(上):理论基础和数据来源

    目前随着汽车技术的发展,车辆上各种驾驶辅助功能越来越多,无人驾驶的研发现在也在如火如荼地进行。随着这些辅助驾驶和无人驾驶功能的增加,汽车电控系统的功能安全越来越受到重视,功能安全对系统开发、软件与硬件开发、生产售后、功能安全管理以及安全分析等

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包