没有合适的资源?快使用搜索试试~ 我知道了~
图解JVM的内存结构及字符串常量池方法详解.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 43 浏览量
2022-07-04
22:47:07
上传
评论
收藏 230KB DOCX 举报
温馨提示
试读
12页
JVM包含了非常多的知识,比较核心的有 内存结构 、 类加载 、 类文件结构 、 垃圾回收 、 执行 引擎 、 性能调优 、 监控 等等这些知识,但所有的功能都是围绕着 内存结构 展开的,因为我们编译后的代码信息在运行过程中都是存在于JVM自身的内存区域中的,并且这块区域相当的智能,不需要C++那样需要我们自己手动释放内存,它实现了 自动垃圾回收机制 ,这也是Java广受喜爱的原因之一。因此,学习JVM我们首先就得了解其内存结构,熟悉包含的东西,才能更好的学习后面的知识。
资源推荐
资源详情
资源评论
JVM 包含了非常多的知识,比较核心的有内存结构、类加载、类文件结构、
垃圾回收、 执行 引擎、性能调优、监控等等这些知识,但所有的功能都是
围绕着内存结构展开的,因为我们编译后的代码信息在运行过程中都是存在于
JVM 自身的内存区域中的,并且这块区域相当的智能,不需要 C++那样需要我
们自己手动释放内存,它实现了自动垃圾回收机制,这也是 Java 广受喜爱的
原因之一。因此,学习 JVM 我们首先就得了解其内存结构,熟悉包含的东西,
才能更好的学习后面的知识。
内存结构
如上图所示,JVM 运行时数据区(即内存结构)整体上划分为线程私有和线
程共享区域,线程私有的区域生命周期与线程相同,线程共享区域则存在于
整个运行期间 。而按照 JVM 规范细分则分为程序计数器、虚拟机栈、本地
方法栈、方法区和堆五大区域(直接内存不属于 JVM)。
1. 程序计数器
如其名,这个部件就是用来记录程序执行的地址的,循环、跳转、异常等等需
要依靠它。为什么它是线程私有的呢?以单核 CPU 为例,多线程在执行时是轮
流执行的,那么当线程暂停后恢复就需要程序计数器恢复到暂停前的执行位置
继续执行,所以必然是每个线程对应一个。由于它只需记录一个执行地址,所
以它是五大区域中唯一一个不会出现OOM(内存溢出)的区域。另外它是控
制我们 JAVA 代码的执行的,在调用native方法时该计数器就没有作用了,而
是会由操作系统的计数器控制。
2. 虚拟机栈
虚拟机栈是方法执行的内存区域,每调用一个方法都会生成一个栈帧压入栈中,
当方法执行完成才会弹出栈。栈帧中又包含了局部变量表、操作数栈、动态
链接、方法出口。其中局部变量表就是用来存储局部变量的(基本类型值和
对象的引用),每一个位置 32 位,而像 long/double 这样的变量则需要占用两
个槽位;操作数栈则类似于缓存,用于存储执行引擎在计算时需要用到的局部
变量;动态链接这里暂时不讲,后面的章节会详细分析;方法出口则包含异常
出口和正常出口以及返回地址。下面来看三个方法示例分别展示栈和栈帧
的运行原理。
入栈出栈过程
public class ClassDemo1 {
public static void main(String[] args) {
new ClassDemo1().a();
}
static void a() { new ClassDemo1().b(); }
static void b() { new ClassDemo1().c(); }
static void c() {}
}
如上所示的方法调用入栈出栈的过程如下:
栈帧执行原理
public class ClassDemo2 {
public int work() {
int x = 3;
int y = 5;
int z = (x + y) * 10;
return z;
}
public static void main(String[] args) {
new ClassDemo2().work();
}
剩余11页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功