JVM内存模型入门
本文是学习笔记,原文地址在:https://www.bilibili.com/video/av62009886
综述
其实没有太多新东西
JVM主要分为五个区域:栈区、堆区、本地方法栈、程序计数器和方法区(元数据空间)。
本地方法栈是存储C++的native方法运行的栈区
程序计数器指向程序运行的位置
方法区主要存储静态的方法和变量,类加载器classloader等等全局的数据
堆区主要存对象,栈区存储对象的引用类型
栈、本地方法栈和程序计数器合起来是线程私有的,堆区和方法区是全局共享的。
实例讲解
值类型函数调用
在栈空间存储活动记录:
函数运行完成后,栈空间会被释放
Java的基础数据类型都是值类型,但包装类不是!包装类是引用类型,数据在堆上!
对象类型函数调用
注意看函数中的那个Person p=new Person();
,它在堆上开辟了一段内存并存储对象(由于没有初始化,id默认是0,name默认是null),栈中保存的是引用类型,只占4个字节,此时函数参数也是地址,所以我们对对象的修改会持久反映在对象上,这就是和值类型的不同。
方法区
例如main函数,就是存在于方法区的(因为它是静态方法)。
一个例子
例如如下这段代码:
注意这里的Main和main函数不是一回事,Main是指那个大类。new Main().func1(p2);
看的时候不要混了。实际上是创建了一个新的匿名对象并调用了这个对象的func1方法