jvm组成
jvm的组成包括 类加载器,字节码执行引擎,内存模型。(并不是只有内存模型)
这图必背
要理解每个区域放的数据是什么
- 栈:局部变量,栈帧的概念
- 程序计数器:字节码的行号指示器
- 本地方法栈:native修饰的方法所需要的内存区域
- 方法区:类信息、常量、静态变量数据
- 堆:所有的对象
- 直接内存:它不属于jvm定义的内存区域,记住即可,NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer
栈
定义:
定义:
- 栈:每个线程都有自己独有的一个空间放自己的局部变量
- 栈帧:每个线程会为自己的每个方法分配一块对应的内存空间(因为每个方法都有自己的局部变量)只有位于栈顶的栈帧才是在运行的,其被称为当前栈帧
- 栈深:栈内栈帧数量,递归的时候
- 栈数:栈区域大小固定,栈深越深,那么对应可创建栈/线程数越少
局部变量表
- 存放方法参数和方法内定义的局部变量。
- 局部变量表的容量是以变量槽来表示,并没有明确指出一个槽对应的内存空间,只是说每个变量槽都应该能存放一个boolean,byte,char,short,int,float,reference,returnAddress类型的数据
- 会使用局部变量表来完成方法参数值到参数列表的传递,也就是所谓的值传递(java所有的参数传递都是 传值,从来没有 传引用 这个事实,传对象就是传地址也就是传引用了)
- 局部变量表第0位用于方法所属的对象实例,也就是我们使用的this关键字
操作数栈
- 它是一个Last In Firtst Out 栈,存放的是一些临时计算结果,如算术运算时通过将运算设计的操作数压入栈顶后调用运算指令进行。
- jvm字节码执行引擎被称为“基于栈的执行引擎”,这个栈就是指操作数栈(大多数操作嗾使在此处执行)
动态链接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用时为了支持方法调用过程中的动态连接
返回地址
方法的完成有两种类型,一种是正常调用完成,一种是异常退出。但无论那种方式退出,都必须返回最初方法被调用的位置。因此一般来说,记录主调方法的PC计数器的值可以作为返回地址
程序计数器
定义
它是当前线程所执行的字节码的行号指示器。每个线程都有一个自己的程序计数器,每运行一行代码,字节码执行引擎就会令计数器就会加一。
作用
java多线成是通过线程轮流切换,分配处理器执行时间的方式来实现的,因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。
本地方法栈
每个线程都有一个自己的本地方法栈,本地方法栈是本地方法运行需要的内存区域。本地方法就是native修饰的方法,底层是C语言实现,它会自动去找操作系统的库函数。
方法区
jdk1.8以前被称为"永久代"。因为它与堆共享内存
jdk1.8以后被称为“元空间”。因为它与堆不再共享内存
其中运行时常量池由字面量和符号引用组成
堆
为堆设置了空间的大小,分数表示各个不同区的占比,new出来的对象放在eden区
所有对象都放在堆中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。