JVM底层结构

引言

Java的优点:一次编写,处处执行,即跨平台。
Java如何做到跨平台呢?JVM底层结构_第1张图片
首先看这张图片,我们写的Java代码,通过Javac编译成字节码文件,然后通过Java命令进入jvm。但是在不同的平台上机器码不一样,所以jvm一个宏观上的理解就是:从软件层面屏蔽不同操作系统在底层硬件与指令上的区别。

JVM虚拟机结构图

JVM底层结构_第2张图片

JVM各组成部分:

  • 运行时数据区(内存模型)
  • 类转载子系统
  • 字节码执行引擎

运行时数据区(内存模型):

  • 栈(线程栈)
  • 本地方法栈
  • 方法区(元空间)
  • 程序计数器

栈(线程栈)

程序在运行时会有很多个线程,每产生一个新的线程,Java的线程栈就会给线程分配一段栈内存区。
栈帧:Java中方法在运行时,栈会给每一个方法分配一段栈帧内存区,里面放各自方法的局部变量。栈帧内存区存放在栈中。
当方法执行完,栈帧中相应的内存区就被干掉
栈的结构:FILO,在JVM中亦然,先调用的方法,分配栈帧内存区之后压栈,后调用的方法,先被干掉。
以代码为例:
JVM底层结构_第3张图片
在代码运行时,首先线程栈会给它分配一个栈内存区,然后执行main方法,这个栈内存区给main方法分配一个栈帧内存区,并压入栈底。main方法中调用Computer时,给computer方法分配一个栈帧内存区,当Computer方法执行完成之后,将为该方法分配的栈帧从栈中干掉。最后,main方法执行完成之后,将main方法对应的栈帧干掉。(FILO)

栈帧内部

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法出口

方法区(元空间)

  • 常量
  • 静态变量(new出来的对象放在堆里面)
  • 类元信息

堆和方法区:
堆中的对象的头会存放类的信息指针,指向方法区

程序计数器

记录程序执行的位置。行数。

本地方法

每个线程独有,底层C语言与Java交互调用

可能有些地方说的不清楚,若有疑问,下面留言。

你可能感兴趣的:(Jvm)