在线客服
扫描二维码
下载博学谷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 对象都维护一个常量池。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
浅析Java并发工具类在AQS实现
众所周知,AQS是一个Java提高的底层同步工具类。本文就AQS的资源共享方式,state的作用,自定义同步器的方法,CountDownLatch,Semaphore,Semaphore和RateLimiter的区别,CyclicBarrier几方面来为大家浅析Java并发工具类。
8431
2019-08-05 20:07:43
Java基础语法之多线程学习笔记整理
众所周知,利用好多线程机制,可以大大提高系统整体的并发能力以及性能,而且线程间的切换和调度的成本小。因此,多线程是Java学习者必须掌握的语法重点。本文为大家整理了进程和线程、实现多线程方式、设置和获取线程名称、线程优先级和线程控制等等多线程知识点笔记,有需要的朋友一起来学习吧!
6290
2019-12-09 14:33:59
MySQL学习总结之DQL查询语句
DQL查询语句又叫数据库查询语句,这是Java学习者在学习MySQL时,必须了解和掌握的知识点之一。众所周知,DQL查询语句有四种查询方式:排序查询、聚合函数、分组查询和分页查询。下面让我们一一仔细梳理这四种查询方式,有需要学习的小伙伴赶紧来看看MySQL学习总结之DQL查询语句的知识点吧!
5584
2020-02-11 23:24:05
Java学习技巧和方法有哪些?
Java的方法和经验,文法初始化阶段,必须首先学习如何操作对象,如何操作 if和 for,如何操作 list set map,然后是如何处理线程、 IO和 jdbc等,其余部分,如果暂时还不了解,可以以后再学习。这一步就到了,你可以写一些小程序,打印在控制台上,练习逻辑思维。再一次被称为 JAVASE毕业,实际上只是入门,如果要向 WEB方向发展,这些已经基本足够了。
4912
2020-06-22 16:27:34
微服务和分布式的区别什么?有什么特点?
微服务设计是为了不因为某个模块的升级和BUG影响现有的系统业务。微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上也可以是同一个服务器。分布式属于微服务,将模块拆分成一个独立的服务单元通过接口来实现数据的交互。分布式和微服的架构很相似,只是部署的方式不一样而已。
5440
2021-03-10 11:10:50
