添加VX:ruyuan0220,回复:CSDN,领取更多精品学习资料!
目录
背景知识
我们先聊了一下相关的背景知识:JVM类加载这块的机制,简单介绍一下。
大家需要搞明白的是,在什么情况下会触发类的加载?加载之后的验证、准备和解析分别是干什么的?
尤为重要的是准备阶段和初始化阶段,是如何为类分配内存空间的?然后类加载器的规则是什么?
来看图简单介绍一下。
大厂面试背景引入
很多人想要到阿里、美团、京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累
所以在了解完了JVM的类加载机制之后,先一起来看看JVM的内存区域划分,这个基本上是互联网公司面试必问。
到底什么是JVM的内存区域划分?
其实这个问题非常简单,JVM在运行我们写好的代码时,他是必须使用多块内存空间的,不同的内存空间用来放不同的数据,然后配合我们写的代码流程,才能让我们的系统运行起来。
举个最简单的例子,比如咱们现在知道了JVM会加载类到内存里来供后续运行,那么我问问大家,这些类加载到内存以后,放到哪儿去了呢?想过这个问题吗?
所以JVM里就必须有一块内存区域,用来存放我们写的那些类。
我们来看下面的图:
继续来看,我们的代码运行起来时,是不是需要执行我们写的一个一个的方法?
那么运行方法的时候,方法里面有很多变量之类的东西,是不是需要放在某个内存区域里?
接着如果我们写的代码里创建一些对象,这些对象是不是也需要内存空间来存放?
同样的,大家看下图:
这就是为什么JVM中必须划分出来不同的内存区域,它是为了我们写好的代码在运行过程中根据需要来使用的。
接下来,我们就依次看看JVM中有哪些内存区域。
存放类的方法区
这个方法区是在JDK 1.8以前的版本里,代表JVM中的一块区域。
主要是放从“.class”文件里加载进来的类,还会有一些类似常量池的东西放在这个区域里。
但是在JDK 1.8以后,这块区域的名字改了,叫做“Metaspace”,可以认为是“元数据空间”这样的意思。当然这里主要还是存放我们自己写的各种类相关的信息。
举个例子,还是跟我们之前说的那样