高频面试题-请聊一下JVM的内存结构!-阿里云开发者社区

开发者社区> Ijiran> 正文

高频面试题-请聊一下JVM的内存结构!

简介: 凡是三年以上开发经验的人,都会在简历上写上这么一句话,了解/熟悉JVM(内存结构),对垃圾回收机制有一定的理解。 但是往往大部分人是一问三不知的,或者是没准备充分,又或者是根本就是瞎编,最起码背一下概念,说不准面试官也不会呢。 接下来的文章会围绕着JVM、JMM、垃圾回收算法、垃圾回收器、如何调优几个方面的知识来聊一下。
+关注继续查看

万里长征走出第一步。

今天我们就来看一下JVM的内存结构,虽然是概念性的知识;但凭借着理论知识,结合日常的开发工作,日积月累下来,对平时的编程影响甚广。

我这里是以JDK8为例,描述一下JVM的内存结构,如果想要了解更多更全面的知识,其实买本书看会更有效果,《深入理解Java虚拟机》。

画了一张图,先看一下!7994483a36071d535786dbe1e89a48e.png整体来说,可以分为线程私有、线程共享两种类型,下面来看一下吧!


线程私有


程序计数器(Program Counter Register)

线程执行的字节码行号指示器,通过改变计数器的值来选取下一条要执行的字节码指令,只为Java方法计数。

因为每个线程有自己独立的行号,由于程序计数器所占内存小之又小,所以每个线程使用独立计数器来处理是说得通的,这样并不会造成什么压力,反而因为每个线程都私有一个计数器而快很多。

这也就是程序技术器是线程私有的原因。


虚拟机栈 (Stack)(特性:后进先出)

Java方法执行时的内存模型,包含着诸多个栈帧。

栈帧是方法运行期间中的基础数据结构,每个栈帧中主要包含了局部变量、操作数栈、动态连接、返回地址等等。

虚拟机栈中存储了线程中执行方法的栈帧,只有当方法执行完毕后,栈帧才会被销毁。

这里还有一个比较重要,而且问的比较频繁的一个知识点:如何引起StackOverflowError、OutOfMemoryError异常,为什么?

这个问题我们在之后的文章中会加以讲解,大家也可以自行去研究一下。

本地方法栈

本地方法栈与虚拟机栈的功能类似,虚拟机栈是为Java方法提供服务,而本地方法栈是为Native方法服务。


线程共享


元空间(MetaSpace)

用于存储被加载的类信息、常量、静态变量等等数据。

在JDK1.8之前,这些数据存储于方法区,也就是我们常说的永久代(PermGen)。

不同于永久代占用Java虚拟机内存,元空间是直接使用本地内存存储。

更换成元空间的好处很多,比如:

  1. 字符串常量池存放在永久代中的时候,容易出现内存溢出、性能问题。
  2. 类信息的大小难以确定,因为永久代使用的是Java虚拟机内存,所以指定永久代内存时会有一定的难度。
  3. 在《深入理解Java虚拟机》一书中提到过,其他虚拟机(如:JRockit、IBM J9)等,都没有永久代。这也就说明了Java虚拟机(HotSpot)无法与其他的虚拟机进行集成搭配;当使用了元空间后,这个问题就迎刃而解了。


堆 (Heap)

Java堆是所有线程共享的一块内存区域,也是Java虚拟机中所管理的最大的一块内存。

其中存储着几乎所有的对象实例,同时我们之后要说的垃圾回收机制,也是针对堆来说的,因为堆是垃圾收集器管理的主要区域。

如果根据垃圾回收集器的角度来看,堆还能分为新生代(Eden、From Survivor、To Survivor)、老年代。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10006 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26775 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2958 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11585 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2498 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7456 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7333 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4481 0
+关注
86
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载