JVM整体结构-java栈详解
Posted 如月之恒-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM整体结构-java栈详解相关的知识,希望对你有一定的参考价值。
文章目录
JVM整体结构
JVM与VMWare都是虚拟机的一种。
JVM由三个子系统构成:
- 类加载器子系统
- 运行时数据区(内存结构)
- 执行引擎(包含垃圾收集器)
下图是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中,该引用对象会在From和To中进行15次轮询。每次轮询过程是这样的:
轮询过程:
From进行轻GC,该对象存在引用则放到To中。
To进行轻GC,该对象存在引用则放到From中。(其实此时To已变成FROM。不用管,反正就是在这两个之间转来转去。)
如果15次轮询后该对象还存在引用,则放到Old Generation中。
Old Generation的GC机制采用的Full GC,会耗费较大的内存。
执行引擎
执行引擎:读取运行时数据区的java字节码并逐个执行。
(这个要开展的话会很深,等博主能力提高了再去了解吧。)
注
- 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
- 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。
以上是关于JVM整体结构-java栈详解的主要内容,如果未能解决你的问题,请参考以下文章