没有合适的资源?快使用搜索试试~ 我知道了~
JVM核心知识点梳理以及JVM面试题总结
需积分: 0 0 下载量 152 浏览量
2023-06-21
09:04:23
上传
评论
收藏 385KB DOCX 举报
温馨提示
试读
40页
JVM核心知识点梳理以及JVM面试题总结;JVM核心知识点梳理以及JVM面试题总结;JVM核心知识点梳理以及JVM面试题总结
资源推荐
资源详情
资源评论
JVM 核心知识点梳理以及 JVM 面试题
总结
内存结构
线程共享区域
堆(用于存放对象实例)
1、新生代
(1)Eden 区
(2)Survivor(from)区(设置 Survivor 是为了减少送到老年代的对象 )
(3)Survivor(to)区 (设置两个 Survivor 区是为了解决碎片化的问题)
(4)eden:survivor:survivor = 8:1:1
2、老年代
老年代:新生代=2:1
方法区
1、运行时常量池
(1)Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加
载后被放入这个区域。
(2)存储信息
符号引用
1)符号引用包含的常量
�
类符号引用
�
�
方法符号引用
�
�
字段符号引用
�
2)概念解释
一个 java 类(假设为 People 类)被编译成一个 class 文件时,如果 People 类
引用了 Tool 类,但是在编译时 People 类并不知道引用类的实际内存地址,因此
只能使用符号引用来代替。而在类装载器装载 People 类时,此时可以通过虚拟
机获取 Tool 类的实际内存地址,因此便可以既将符号 org.simple.Tool 替换为
Tool 类的实际内存地址,及直接引用地址。 即在编译时用符号引用来代替引用
类,在加载时再通过虚拟机获取该引用类的实际地址。以一组符号来描述所引用
的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
符号引用与虚拟机实现的内存布局是无关的,引用的目标不一定已经加载到内存
中。
字面量
�
文本字符串(String a = "abc",这个 abc 就是字面量)
�
�
八种基本类型(int a = 1; 这个 1 就是字面量)
�
�
声明为 final 的常量
�
2、静态变量
3、final 类型常量
4、类信息
�
类的完整有效名
�
�
返回值类型
�
�
修饰符(public,private...)
�
�
变量名
�
�
方法名
�
�
方法代码
�
�
这个类型直接父类的完整有效名(除非这个类型是 interface 或是
java.lang.Object,两种情况下都没有父类)
�
�
类的直接接口的一个有序列表
�
线程私有区域
虚拟机栈
1、栈帧
(1)动态链接
�
符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接。
�
�
前提是每一个栈帧内部都要包含一个指向运行时常量池的引用,来支持动
态链接的实现。
�
(2)操作数栈
保存着 Java 虚拟机执行过程中的数据
(3)局部变量表
1)局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个
方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改
变局部变量表的大小。
2)存放的信息
�
基本数据类型
�
�
对象引用
�
�
returnAddress 类型
�
(4)方法返回地址
1)方法被调用的位置
2)方法退出的过程实际上就等同于把当前栈帧出栈
3)方法退出可能包含的操作
�
恢复上层方法的局部变量表和操作数栈
�
�
把返回值(如果有的话)压入调用者栈帧的操作数栈中
�
�
调整 PC 计数器的值以指向方法调用指令后面的一条指令
�
2、异常
线程请求的栈深度大于虚拟机所允许的深度(StackOverflowError )
JVM 动态扩展时无法申请到足够的内存时(OutOfMemoryError )
在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经
完全确定了,并且写入到方法表的 Code 属性之中,因此一个栈帧需要分配多少
内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
本地方法栈
和虚拟机栈类似,区别是本地方法栈为使用到的 Native 方法服务
程序计数器
1、如果线程正在执行的是一个 Java 方法,则指明当前线程执行的代字节码行数
2、此内存区域是唯一一个不会出现 OutOfMemoryError 情况的区域。
3、如果正在执行的是 Natvie 方法,这个计数器值则为空(Undefined)
上述三个区域的生命周期和线程相同
直接内存
1、使用 Native 函数库直接分配堆外内存
2、并不是 JVM 运行时数据区域的一部分,但是会被频繁使用
3、避免了在 Java 堆和 Native 堆中来回复制数据,能够提高效率
内存分配
对象优先在 Eden 区分配
大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间分配时,
虚拟机将发起一次 Minor GC。
大对象直接进入老年代
最典型的大对象是那种很长的字符串以及数组。
剩余39页未读,继续阅读
资源评论
Andy&lin
- 粉丝: 97
- 资源: 214
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功