JVM内存结构
运行时数据区域:
线程私有:
程序计数器:指明当前线程执行的字节码行数,如果是native方法这个计数器是null
栈:是一种数据结构,先进后出
虚拟机栈:
一个线程中如果有多个方法时,一个有一个栈帧
局部变量表:用于存放局部变量
操作数栈:就是一个栈
动态链接:java语言多态性
返回地址:正常返回
本地方法栈:本地方法栈native方法调用JNI到了底层
线程共享:
堆/方法区,1.8之前方法区叫永久代,之后叫做元空间
永久代与元空间的区别,永久代受堆大小的限制
元空间受系统内存空间的大小。永久代容易造成内存溢出。
运行时常量池:
符号引用:A引用B,如果B还没有被加载。会先给A一个符号引用
字面量:String s= “abc”,abc就是字面量
在jdk1.6时,在方法区,1.7在堆中
直接内存:
不是JVM运行时数据区域的一部分,但是会被频繁使用
站在线程的角度:
虚拟机栈,本地方法栈,程序计数器三个区域的生命周期和线程相同
线程共享区域:涉及到生命周期管理,和垃圾回收
栈:
以栈帧的方式存储方法的调用过程,并存储方法调用过程中基本数据类型的变量
堆:
用来存储java中的对象。无论成员变量,局部变量,还是类变量
栈内存线程私有,堆内存线程共享