简单来说jvm内存模型
jvm拿到分配给他的内存之后把内存割分为五部分
栈、堆、本地方法栈、程序计数器、方法区
栈:存储方法执行过程中的一些临时变量(存储的是对象的引用类型,即地址,指向堆中的对象)
堆:存对象
本地方法栈:本地c++的native方法运行时的方法区
程序计数器:指向程序当前执行的位置
方法区:存储一些元数据信息(1.7及之前为永久代) 主要内容是一些static的静态资源以及类加载器classloader这样的全局信息
其中 栈本地方法栈、程序计数器这三部分是线程私有的,也就是说每个线程再运行的过程中都会开辟一份这样的内存
堆区和方法区是全局共享的
当操作基本数据类型时:
划重点:基本数据类型的存储时直接存到内存,并非根据地址区寻址,而改变是直接在栈帧上进行的,并不是改变指向的地址
栈的删除过程:根据先进后出的原则会先删除b然后删除a
运行结果
第二个重点 对形参的改变会重新创建存储区域,在内部的改变不会影响外部的数据
在func1方法执行完之后,为该方法开辟的栈区会被删除,并且在func1方法中执行的修改不会影响到main方法的栈区
在运行引用类型对象时:
首先要清楚new关键词做了什么
1 在堆中开辟了一块空间用来保存新创建的Person对象
2 执行构造方法
3 返回新对象的地址
当方法执行结束后,a、b、p都会被清理掉,对应栈空间也会被回收
但是堆中的对象无法在程序运行的过程中确定是否需要回收(因为他不知道是否有其他的栈中的对象指向了他)
这就是为什么我们用到GC的原因