在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
Java基础Jvm如何加载类?如何分配空间?指的是将 class 文件的二进制数据读入到运行时数据区(JVM在内存中划分的)中,并在方法区内创建一个 class 对象JVM 运行起来时就给内存划分空间,这块空间就称为运行时数据区。
运行时数据区被划分为以下几块内容:
1、栈:
每一个线程运行起来的时候就会对应一个栈(线程栈),栈中存放的数据被当前线程所独享不会产生资源共享情况,所以线程是安全的。
而栈当中存放的是栈帧,当线程调用方法时,就是形成一个栈帧,并将这个栈帧进行压栈操作。方法执行完后,进行出栈操作。这个栈帧里面包括局部变量,操作数栈,指向当前方法对应类的常量池引用,方法返回地址等信息。
2、本地方法栈:
本地方法栈的机制和栈的相似,区别在于,栈运行的是Java 实现的方法,而本地方法栈运行的是本地方法。本地方法指的是 JVM 需要调用非Java 语言所实现的方法,例如 C 语言。在 JVM 规范中,没有强化性要求实现方一定要划分出本地方法栈(例如:HotSpot 虚拟机将本地方法栈和栈合二为一)和具体实现(不同的操作系统,对 JVM规范的具体实现都不一样)。
3、程序计数器:
程序计数器也可以称为 PC 寄存器(通俗讲就是 指令缓存)。它主要用于缓存当前程序下一条指令的指令地址,CPU 根据这个地址找到将要执行的指令。这个寄存器是 JVM内部实现的,不是物理概念上的计数器,不过和 JVM 的实现逻辑一样。
4、堆:
堆内存主要存放创建的对象和数组。堆内存在 JVM 中是唯一的,能被多个线程所共享。堆里面的每一个对象都存放着实例的实例变量。堆内存的对象没有被引用,会自动被 Java垃圾回收机制回收。
当在方法中定义了局部变量,如果这个变量是基本数据类型,那么这个变量的值就直接存放在栈中;如果这个变量是引用数据类型,那么变量值就存放在堆内存中,而栈中存放的是指向堆中的引用地址。
5、方法区:
方法区在 JVM 也是一个非常重要的一块内存区域,和堆一样,可以被多个线程多共享。
主要存放每一个加载 class 的信息。class 信息主要包含魔数(确定是否是一个 class 文件),常量池,访问标志(当前的类是普通类还是接口,是否是抽象类,是否被 public 修饰,是否使用了 final修饰等描述信息......),字段表集合信息(使用什么访问修饰符,是实例变量还是静态变量,是否使用了 final 修饰等描述信息.....),方法表集合信息(使用什么访问修饰符,是否静态方法,是否使用了 final 修饰,是否使用了 synchronized 修饰,是否是native 方法......)等内容。当一个类加载器加载了一个类的时候,会根据这个 class 文件创建一个class 对象,class 对象就包含了上述的信息。
后续要创建这个类的实例,都根据这个 class 对象创建出来的。
6、常量池:
常量池是方法区中的一部分,存放 class 对象中最重要的资源。JVM 为每一个 class 对象都维护一个常量池。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
2019年Spring Boot面试题集合附答案
相信所有Java开发者都认同,在微服务中,Spring Boot是最好的Java框架。Spring Boot自身最大的优势就是简化配置,可以说它真正实现了自动化配置。因此大家要想做好Java开发,给大家的建议就是成为Spring Boot的高手。本文为大家整理了2019年最新的Spring Boot面试题和答案,如果大家能够好好做一做这份面试题集合,相信面试一定手到擒来。
6822
2019-12-20 18:05:36
TLAB线程本地分配缓存区是什么?TLAB工作原理分析
TLAB线程本地分配缓存区是什么?工作原理分析,TLAB全称Thread Local Allocation Buffer,即线程本地分配缓存区,是一个线程专用的内存分配区域。在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用。
8674
2020-03-17 15:26:25
Java内存模型JMM基础知识及原理
Java内存模型JMM基础知识及原理,学习过程中需要了解内存模型抽象结构、共享变量、JMM抽象结构模型、主内存与工作内存的相关知识,Java内存模型具有原子性、可见性、有序性三大特征。
4819
2020-07-27 11:58:33
Java类隔离加载实现原理是什么?
Java类隔离加载实现原理: JVM 提供一个全局类加载器的设置接口,直接替换全局类加载器,但无法解决多个自定义类加载器同时存在的问题。然而JVM会选择当前类的类加载器来加载所有该类的引用的类。
5207
2020-12-31 14:10:07
缓存的淘汰策略有几种方式?分别怎么用?
缓存的淘汰策略有几种方式? 缓存是将一些需要读取数据放在磁盘或者内存中,由于是追求速度从而一般放在内存中。在有些场景中无法解决读的速度,因此要使用缓存,而缓存有容量有限,若缓存满了系统会如何淘汰一些数据?
4313
2022-03-24 14:48:17
热门文章
- 前端是什么
- 前端开发的工作职责
- 前端开发需要会什么?先掌握这三大核心关键技术
- 前端开发的工作方向有哪些?
- 简历加分-4步写出HR想要的简历
- 程序员如何突击面试?两大招带你拿下面试官
- 程序员面试技巧
- 架构师的厉害之处竟然是这……
- 架构师书籍推荐
- 懂了这些,才能成为架构师 查看更多
扫描二维码,了解更多信息
