JVM整体结构-java栈详解

导读:本篇文章讲解 JVM整体结构-java栈详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

JVM整体结构

JVM与VMWare都是虚拟机的一种。
JVM由三个子系统构成:

  1. 类加载器子系统
  2. 运行时数据区(内存结构)
  3. 执行引擎(包含垃圾收集器)

下图是JVM结构图:
在这里插入图片描述

本文重点:运行时数据区(内存结构)

在这里插入图片描述
蓝色标记为线程具体执行的,浅橙色标记的为整个进程共享的。

  • 堆:new 出来的对象都放在堆中
  • java栈:线程运行的数据和计算都放在栈中

在这里插入图片描述

java栈

示例代码:

package test;

public class Math {
	public static final Integer NUMBER = 6;
	public int math(){
		int a =1;
		int b = 2;
		int c = (a+b)*10;
		return c;
	}
	
	public static void main(String[] args) {
		Math math = new Math();
		math.math();
	}
}

java栈结构图

  • 本地方法栈就是navicat的方法,基本不用。
    在这里插入图片描述
    线程运行时,java每个方法都会在java栈中有一个栈帧,栈帧是java具体方法存储数据的地方。如上述代码就有两个栈帧。
    根据栈先进后出,那么先运行的main方法就是先把栈帧加载到java栈中,然后是math方法的栈帧加载到java栈中,math执行完移除java栈,回到main方法执行,执行完成也将main方法移出Java栈,Java栈就被清空了。

栈是先进后出,队列是先进先出。

java栈中栈帧运行过程

将Math.java用命令行javac生成Math.class
再用如下命令生成文件Math.txt去分析栈帧的执行。
一定要结合 Math.txt的jvm命令集信息去理解java栈的运行过程。

javap -c Math.class > Math.txt

在这里插入图片描述

  • 动态链接:接口类调用具体实现类的方法就会运用到动态链接。

  • 堆(线程共享):虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法在该空间中请到内存时将抛出outOfMemoryErrot 异常。同时也是垃圾收染器管理的主要区域。可通过一 Xmx 一 XmS 参数来分别指定最大堆和最小堆。
  • 堆结构图如下
    在这里插入图片描述
  • 堆的运行机制
    当我们new对象时,new出来的的对象先存放到Eden中,轻GC会定期执行,将Eden无引用的对象清理掉。有引用的对象会被放到From中,该引用对象会在FromTo中进行15次轮询。每次轮询过程是这样的:

轮询过程:
From进行轻GC,该对象存在引用则放到To中。
To进行轻GC,该对象存在引用则放到From中。(其实此时To已变成FROM。不用管,反正就是在这两个之间转来转去。)
如果15次轮询后该对象还存在引用,则放到Old Generation中。

Old Generation的GC机制采用的Full GC,会耗费较大的内存。

执行引擎

执行引擎:读取运行时数据区的java字节码并逐个执行。
(这个要开展的话会很深,等博主能力提高了再去了解吧。)
在这里插入图片描述

  • 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
  • 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69836.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!