Java内存分区(深入理解java虚拟机学习笔记)

程序计数器:  

      1、较小的内存空间

    2、看做当前线程所执行的字节码的行号指示器,对比汇编语言

    3、线程独有

4、如果线程正在执行一个java方法,计数器记录的是正在执行的虚拟机字节码指令地址

5、如果执行的是native方法,则计数器为空


Java虚拟机栈

1、线程私有

2、Java方法执行的内存模型,

3、每个方法执行都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息

4、局部变量表中存储了各种基本数据类型

5局部变量表中存储了对象引用,不同于对象本身,,,注意这一点,请看java编程思想

6 线程请求的栈深度大于虚拟机所允许的深度出现栈溢出错误

7、虚拟机栈会动态扩展无法申请到足够内存会抛出outofmemoryerror异常

8、当进入一个方法,这个方法需要在帧中分配多大的局部变量空间完全确定,方法运行期间不会改变局部变量表的大小


本地方法栈

本地方法栈发挥的作用域虚拟机栈发挥的作用相似,区别在于虚拟机栈为java方法服务,本地栈为native方法服务

Java堆

1、java虚拟机所管理的内存中最大的一块

2、被所有线程共享

3、唯一目的就是存放对象实例(注意是对象实例不是对象引用Important)

4、几乎所有对象实例以及数组都要在对上分配

5、java堆是垃圾收集器管理的主要区域,也被称为GC堆

6、从内存回收的角度java堆被细分为:新生代和老年代

新生代可以细分为Eden空间(朝生夕死),From Survivor空间  TO Survivor空间(采用复制清除算法的时候决定了需要这么划分堆空间),新生对象出现在Eden空间,之后就“苟延残喘”,“颠沛流离”

老年代:标记清除算法

7,虚拟机额内存空间都是可扩展的设计成为,通过-Xmx和-Xms控制


方法区:

1、各个线程共享的内存区域

2、类信息

3、常量

4、静态变量

5、即时编译器编译过后的代码等数据

6、具有的特点,在整个虚拟机中只存一份的数据,但并不是所有都放到这里面

7、运行时常量池

    1)方法区的一部分

    2)编译期生成的各种字面量和符号引用

    3)重要特征:动态性,可以在编译期间动态增加常量


直接内存:

    1、不是虚拟机运行时数据区的一部分

2、不是java虚拟机规范中定义的内存矛

3.nio引入通道和缓冲区的io方式,有native函数库直接分配堆外内存,受到本机内存限制,不收java堆大小的限制。、








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章