目的
java内存模型主要目的是定义如何存储变量 的底层细节
分区
1 方法区(Method Area)
主要用来存储类的信息(名称,修饰符),常量,静态变量,静态方法 以及类中的方法,属性信息 通过class对象 获取类的信息都来源于此
内存共享,一般情况下不会被GC回收 ,使用内存超出设定值时也会抛出OutOfMemory异常
是堆中的永久区, 通过 -XX:PermSizw设置初始值 -XX:MaxPermSize设置最大值
2 堆(Heap)
堆是JVM内存中最大的一块, 内存共享 ,多线程不安全的地方,用来存储对象的实例(非基本数据类型), 由GC管理
分为新生代和老年代
3 栈(stack)
java栈总是和线程联系在一起,线程都有自己的栈,栈中有多个栈帧(对应的方法)存储局部变量,方法返回信息,操作数
栈的栈顶就是当前线程正在执行的地方,线程计数器指向的地方,当方法执行完毕就会将该栈帧弹出,回到上个方法,
而方法的返回值就是上个栈帧的操作数
4 程序计数器
是一种数据结构,由于java是多线程的,所以每个线程都记录自己执行到那条地址,类似于localhost,是线程安全的
5 本地方法区
类似与java栈,用来存储Native方法执行的数据
内存
JMM规定java中所有的变量存储在主内存中,每个线程拥有自己的工作内存,线程需要使用主内存的变量会去拷贝一个副本,
对变量的操作都必须使用工作内存里的变量,包括volatile(修改后的新值立刻同步到主内存,每次使用volatile变量前立即从主内存中刷新,变量的变化对每个线程都可见),不同的线程变量不能互相访问