JVM内存结构分析
JVM内存可分为5大块
|–栈
|–本地方法栈
|–堆
|–方法区
|–程序计数器
|–栈
|–含义:可理解成: 线程栈
|–分配时机:当有一个线程启动时,栈大佬分配一个栈小弟给该线程专门来支配,所以说栈是能够被私有的内存空间
|–结构:
|–由栈帧组成(存放具体内容的地方)
|–存放的内容
|–局部变量
|–操作数(即可理解成赋予变量的初始值)
|–若基本数据类型则是存放初始值
|–若引用类型则是存放该对象在堆中的地址
|–动态链接
|–方法出口
|–方法结束时执行到的代码行
|–从程序计数器中得到
|–数据结构也是栈(FILO)
|–本地方法栈
|–含义:顾名思义就是专门用来存放线程中所使用到的本地方法的
ps:本地方法及从刚开始有java的时候便有的方法,和c语言相关,如线程相关的notify()、notifyAll()方法都是本地方法
|–分配时机:和栈相同
|–堆
|–含义:用于存放引用类型的对象(即new出来的对象)
|–分配时机:有对象被创建就分配空间,但这是一个公共区域,大家的对象都放在这里,不能被私有
|–结构:
|–年轻代(占1/3的空间,约200M)
|–Eden区(4/5的空间,约160M)
|–survivor(1/5的空间,40M)
|–老年代(2/3,约400M)
|–方法区
|–含义:用于存放常量、静态变量、类信息(jvm加载.class文件的时候,该类的相关信息)
|–分配时机:上述三者被创建时即分配空间
|–注意:
|–静态变量对应的若为引用类型,存放的同样是该对象在堆中的地址
|–程序计数器
|–含义:相当于当前线程所执行的字节码对象的行号指示器
|–分配时机:线程启动时分配给每个线程(也是私有内存)
|–起到了保证线程安全的作用,线程被阻塞恢复后依旧能够从停止的地方继续执行
内存分配过程
迟些再写,会贴出链接…
若上述内容有误,欢迎大佬指正…