JVM底层结构

  1. 引言
  2. JVM虚拟机结构图
  3. JVM各组成部分:
  4. 运行时数据区(内存模型):
    1. 栈(线程栈)
    2. 方法区(元空间)
    3. 程序计数器
    4. 本地方法

引言

Java的优点:一次编写,处处执行,即跨平台。
Java如何做到跨平台呢?

首先看这张图片,我们写的Java代码,通过Javac编译成字节码文件,然后通过Java命令进入jvm。但是在不同的平台上机器码不一样,所以jvm一个宏观上的理解就是:从软件层面屏蔽不同操作系统在底层硬件与指令上的区别。

JVM虚拟机结构图

在这里插入图片描述

JVM各组成部分:

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

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

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

栈(线程栈)

程序在运行时会有很多个线程,每产生一个新的线程,Java的线程栈就会给线程分配一段栈内存区。
栈帧:Java中方法在运行时,栈会给每一个方法分配一段栈帧内存区,里面放各自方法的局部变量。栈帧内存区存放在栈中。

当方法执行完,栈帧中相应的内存区就被干掉

栈的结构:FILO,在JVM中亦然,先调用的方法,分配栈帧内存区之后压栈,后调用的方法,先被干掉。

以代码为例:

在这里插入图片描述

在代码运行时,首先线程栈会给它分配一个栈内存区,然后执行main方法,这个栈内存区给main方法分配一个栈帧内存区,并压入栈底。main方法中调用Computer时,给computer方法分配一个栈帧内存区,当Computer方法执行完成之后,将为该方法分配的栈帧从栈中干掉。最后,main方法执行完成之后,将main方法对应的栈帧干掉。(FILO)

栈帧内部

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

方法区(元空间)

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

堆和方法区:

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

程序计数器

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

本地方法

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

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


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2470290795@qq.com

文章标题:JVM底层结构

文章字数:585

本文作者:runze

发布时间:2020-01-28, 19:03:38

最后更新:2020-01-28, 19:26:43

原始链接:http://yoursite.com/2020/01/28/JVM/JVM%E5%BA%95%E5%B1%82%E7%BB%93%E6%9E%84/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏