由于还在不断的整理及发现中,更加详细的内容请查看下面的笔记链接;
——>笔记链接点这里<——
一、JVM跨平台特性

二、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);
}
}
操作数栈:就是在程序运行过程中,中转存放的内存空间;