一张图看懂JVM

JVM是什么

jvm是Java虚拟机,是一种虚构的计算机。目的是为了能够在各类计算机上通过构建jvm来运行java代码。

JVM模型

  • 栈:线程栈,内部放局部变量
  • 堆:


首先,栈其实就是线程。内部主要存放局部变量。

栈帧结构


栈帧:栈内的存放单元,线程内的每个方法对应一个栈帧,栈帧内存放着方法的局部变量
这里的方法调用就是栈的方式,调用某方法则某方法的栈帧入栈,调用结束后出栈
操作数栈:操作的调用的栈

方法出口:调用时记录着当该方法调用结束时,应该执行之前方法的哪行代码

程序计数器

程序计数器是一个记录着当前线程所执行的字节码的行号指示器。
每运行完一行代码,都会修改当前数值


用来存放对象,每new一个对象,那么对象实际上就保存在我们的堆呢,并且赋值会使栈内存在对象地址,从而形成一个引用关系

分代现象
  • Eden(生成区):新生成的对象都存放在这里,当Eden满后,会触发Minor GC机制,存活下来的对象移动到Survivor0区,Survivor0区满后触发执行Minor GC,Survivor0区存活对象移动到Suvivor1区,这样保证了一段时间内总有一个survivor区为空。经过多次Minor GC仍然存活的对象移动到老年代。
  • Survivor区:由FromSpaceToSpace组成。
  • 老年代:存储长期存活的对象,占满时会触发Major GC=Full GC,GC期间会停止所有线程等待GC完成,所以对响应要求高的应用尽量减少发生Major GC,避免响应超时。
  • Minor GC : 清理年轻代
  • Major GC : 清理老年代
  • Full GC : 清理整个堆空间,包括年轻代和永久代
    所有GC都会停止应用所有线程。

堆与栈的关系

方法区


用来存放常量、静态变量、类信息

本地方法栈

本地方法(基本淘汰):有 native 修饰,会调用操作系统底层的c语言代码
在java语言出现初期,为了兼容老系统既C语言的代码,则出现了本地方法,来通过本地方法调用老版本的c语言方法。
本地方法的调用就存放于本地方法


点击查看:图片源文件地址


全部评论

相关推荐

牛客162194370号:
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务