JVM整体结构-java栈详解

Posted 如月之恒-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM整体结构-java栈详解相关的知识,希望对你有一定的参考价值。

文章目录

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)。请备注“探讨技术问题”。欢迎交流、一起进步。

以上是关于JVM整体结构-java栈详解的主要内容,如果未能解决你的问题,请参考以下文章

jvm整体结构

JVM垃圾回收内部详解

JVM垃圾回收内部详解

JVM的基本结构及其各部分详解

Java虚拟机(JVM)详解

Jvm(30),理解升级----Java中堆内存和栈内存详解