Java-JVM内存模型

240 阅读2分钟

 由于还在不断的整理及发现中,更加详细的内容请查看下面的笔记链接;

——>笔记链接点这里<——

一、JVM跨平台特性

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8e86ff0aee7744b4beea65568268d60b~tplv-k3u1fbpfcp-zoom-1.image)

二、JVM内存模型

JVM内存主要由如下3个部分:

类装载子系统:

运行时数据区:

**堆:**一般情况下new出来的对象都是放在堆里的;

**栈:**存放局部变量,官方称为“虚拟机栈”,当有个线程启动的时候JVM会针对这个线程分配一个独立的空间,这个空间就是栈,所以在这里把栈称为“线程-栈”更加贴切,栈帧:每个方法分配的专属内存空间;栈的结构特性:先进后出——FILO;是与程序调用的顺序是非常稳和的,这也就是一个编写代码的规范;

**方法区:**运行时常量池,就是初始化堆的符号——内存空间地址,由常量、静态变量、类源信息(类的信息值,也包含堆中的符号引用关系);
本地方法栈:已经使用比较少了,存放native方法,是依靠C++实现的,比如:Thread中的start方法就是一个典型的native方法;
**字节码执行引擎:**用于执行编写的代码,PS:在运行时会开辟一个垃圾收集线程,这个线程也被称为:minor gc;

**程序计数器:**在执行代码的过程中,由于程序是多线程方式运行的,在CPU执行的时候可能会被挂起(抢占CPU资源,会出现的现象),当再次执行的时候程序计数器会告知CPU程序原先被执行到什么地方了;程序每执行一部都会在程序计数器中进行体现;

字节码执行引擎:是用于解析Java编译后的字节码class文件,详细参考:javap命令——javap -c -v;
/**
 * 类描述:  内存模型
 *
 * @author XXSD
 * @version 1.0.0
 * @date 2020/6/22 0022 下午 7:01
 */
public class TheMemoryModel {

    public static final int initData = 6666;

    public static Map<String, Object> thisMap = new HashMap<>();

    public int compute() {
        /*
        * 一个方法对应一个栈帧内存区域;
        * 下面的三个变量都是放在栈上的;
        * */
        int a = 1;
        int b = 2;
        int c = (a + b) * 10;
        return c;
    }

    public static void main(String[] values) {
        TheMemoryModel theMemoryModel = new TheMemoryModel();
        theMemoryModel.compute();
        System.out.println(1);
    }

}

操作数栈:就是在程序运行过程中,中转存放的内存空间;