在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
相信绝大所数的开发求职者在面试中,总能遇到面试官问JVM内存区域的相关知识点。今天小编就来和大家一起复习一遍JVM内存区域,主要内容包括内存区域的划分、运行数据区、生命周期以及了解JVM内存的方法。

1、内存区域的划分
通常可以把 JVM 内存区域分为下面几个方面,其中,有的区域是以线程为单位,而有的区域则是整个 JVM 进程唯一的。
(1)程序计数器。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值。
(2)Java 虚拟机,早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的 Java 方法调用。前面谈程序计数器时,提到了当前方法;同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫做当前帧,方法所在的类叫做当前类。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM 直接对 Java 栈的操作只有两个,就是对栈帧的压栈和出栈。栈帧中存储着局部变量表,操作数栈,动态链接,方法正常退出或者异常退出的定义等。
(3)堆,它是 Java 内存管理的核心区域,用来放置 Java 对象实例,几乎所有创建的 Java 对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定的 “Xmx” 之类参数就是用来指定最大堆空间等指标。理所当然,堆也是垃圾收集器重点照顾的区域,所以堆空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代,老年代的划分。
(4)方法区,这是所有线程共享的一块内存区域,用于存储所谓的元数据,例如类结构信息,以及对应的运行时常量池,字段,方法代码等。由于早期的 Hotspot JVM 实现,很多人习惯将方法区称为永久代。Oracle JDK 8中将永久代移除,同时增加了元数据区。
(5)运行时常量池,这是方法区的一部分。如果仔细分析过反编译的类文件结构,你能看到版本号,字段,方法,超类,接口等各种信息,还有一项信息就是常量池。Java 的常量池可以存放各种常量信息,不管是编译期生成的各种字面量,还是需要爱运行时决定的符号引用,所以它比一般语言的符号表存储的信息更加宽泛。
(6)本地方法栈,它和 Java 虚拟机是非常相似的,支持对本地方法的调用,也是每个线程都会创建一个。在 Oracle Hotspot JVM 中,本地方法栈和 Java 虚拟机栈是在同一块区域,这完全取决于技术实现的决定,并未在规范中强制。
2、运行数据区
我们将类加载入方法区的时候,就已经开始使用运行时数据区了。每个部分各司其职经典的运行时数据区,一共包含五个部分,如下图:

3、生命周期
程序启动产生进程,一个虚拟机对应一个进程,其中(绿色):方法区和堆跟进程的生命周期是一致的。随着虚拟机启动而创建,随着虚拟机退出而销毁 。另外(蓝色):程序计数器,本地方法栈,虚拟机栈,是与线程一一对应的。与线程对应的数据区域会随着线程开始和结束而创建和销毁。
1个运行的程序-->1个进程--->假设里面4个线程: 那里面就有4组程序计数器,本地方法栈,虚拟机栈,而这4组程序计数器,本地方法栈,虚拟机栈公用方法区和堆空间。所以图我们可以画为:

4、了解JVM内存的方法
(1)可以使用综合性的图形化工具,如 JConsole,VisualVM(注意,从 Oracle JDK 9 开始,VisualVM 已经不再包含在 JDK 安装包中)等。这些工具具体使用起来比较直观,直接连接到 Java 进程,然后就可以在图形化界面里掌握内存使用情况。以 JConsole 为例,其内存页面可以显示常见的堆内存和各种堆外部分使用状态。
(2)使用命令行工具进行运行时查询,如 jstat 和 jmap 等工具都提供了一些选项,可以查看堆,方法区等使用数据。
(3)使用 jmap 等提供的命令,生成堆转储文件,然后利用 jhat 或者 Eclipse MAT 等堆转储分析工具进行详细分析。
(4)GC日志等输出,也包含着丰富的信息。
以上就是JVM内存区域复习的所有汇总内容,大家都掌握了吗?
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
零基础在线学Java开发就来博学谷
对于零基础的同学,自学Java开发有很大的难度,学习周期较长而且学习效果无法保障,如果无法参加线下培训,可以选择在线学习Java开发。参加在线Java培训课程可以解决自学没人指导、学习思路不明确的缺点,同时不需要脱产学习,可以自由安排学习时间,优势非常明显。零基础在线学Java开发就来博学谷。
11476
2019-08-08 11:56:38
Java认证考试是什么?Java考试内容有什么?
Java认证考试是什么?Java考试内容有什么?Java认证考试是由Sun公司组织,设置Java 相关的Java程序员和Java开发员认证,考试合格后颁发的国际通用的Java程序员证书。
14699
2019-08-06 17:19:04
并发编程是Java开发的瓶颈?
并发编程是每一个Java程序员升职加薪必将面临的一道坎,不管是提升自己的底层能力,还是要在团队中拥有核心价值都离不开对并发编程。学习同步器AQS、并发容器、线程池、并发安全、Java内存模型5个方面掌握并发编程体系。
7857
2019-12-17 18:23:48
零基础学Java难吗?需要学多长时间?
零基础学Java难吗?需要学多长时间?都说万事开头难,编程零基础的初学者学习Java的难度可想而知,再加上Java本身的内容多,许多自学者学了大半年后都是从入门到放弃。因此建议大家尤其是初学者,最好报培训班进行系统化地学习。那么报培训班需要学多长时间呢?具体时间因人而异,一般是学到四到六个月就可以达到就业的水平。
11377
2019-12-31 16:05:44
Java程序员职业规划如何做?发展方向有哪些?
程序员一直被贴青春饭的标签,很多人写了3年代码生活工作趋于稳定,每天忙忙碌碌抱怨没有时间提升学习,职业发展遇瓶颈,入行前就应该规划好自己的职业发展发展方向。
8618
2021-11-22 11:32:25
