Java 虚拟机-JVM面试题八股文.pdfVIP

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
图⽂详解 50 道Java 虚拟机⾼频⾯试题,这次⾯试,⼀定吊打⾯试官,整理:楼仔,作者:三分恶,戳原⽂ 链接。 ⼀、引⾔ 1.什么是 JVM? JVM——Java 虚拟机,它是 Java 实现平台⽆关性的基⽯。 Java 程序运⾏的时候,编译器将 Java ⽂件编译成平台⽆关的 Java 字节码⽂件(.class),接下来对应平台 JVM 对字 节码⽂件进⾏解释,翻译成对应平台匹配的机器指令并运⾏。 同时 JVM 也是⼀个跨语⾔的平台,和语⾔⽆关,只和 class 的⽂件格式关联,任何语⾔,只要能翻译成符合规范的 字节码⽂件,都能被 JVM 运⾏。 ⼆、内存管理 2.能说⼀下 JVM 的内存区域吗? JVM 内存区域最粗略的划分可以分为堆和栈 ,当然,按照虚拟机规范,可以划分为以下⼏个区域: JVM 内存分为线程私有区和线程共享区,其中⽅法区和堆是线程共享区,虚拟机栈 、本地⽅法栈和程序计数器是 线程隔离的数据区。 1)程序计数器 程序计数器(Program Counter Register)也被称为 PC 寄存器,是⼀块较⼩的内存空间。 它可以看作是当前线程所执⾏的字节码的⾏号指示器。 2)Java 虚拟机栈 Java 虚拟机栈(Java Virtual Machine Stack )也是线程私有的,它的⽣命周期与线程相同。 Java 虚拟机栈描述的是 Java ⽅法执⾏的线程内存模型:⽅法执⾏时,JVM 会同步创建⼀个栈帧,⽤来存储局部变 量表、操作数栈、动态连接等。 3)本地⽅法栈 本地⽅法栈(Native Method Stacks)与虚拟机栈所发挥的作⽤是⾮常相似的,其区别只是虚拟机栈为虚拟机执⾏ Java ⽅法(也就是字节码)服务,⽽本地⽅法栈则是为虚拟机使⽤到的本地(Native)⽅法服务。 Java 虚拟机规范允许本地⽅法栈被实现成固定⼤⼩的或者是根据计算动态扩展和收缩的。 4)Java 堆 对于 Java 应⽤程序来说,Java 堆(Java Heap )是虚拟机所管理的内存中最⼤的⼀块。Java 堆是被所有线程共享 的⼀块内存区域,在虚拟机启动时创建。此内存区域的唯⼀⽬的就是存放对象实例,Java ⾥“⼏乎”所有的对象实例 都在这⾥分配内存。 Java 堆是垃圾收集器管理的内存区域,因此⼀些资料中它也被称作“GC 堆” (Garbage Collected Heap,)。从回 收内存的⻆度看,由于现代垃圾收集器⼤部分都是基于分代收集理论设计的,所以 Java 堆中经常会出现新⽣代 、 ⽼年代 、Eden空间、From Survivor空间、To Survivor空间等名词,需要注意的是这种划分只是根据垃圾回 收机制来进⾏的划分,不是 Java 虚拟机规范本身制定的。 5)⽅法区 ⽅法区是⽐较特别的⼀块区域,和堆类似,它也是各个线程共享的内存区域,⽤于存储已被虚拟机加载的类型信 息、常量、静态变量、即时编译器编译后的代码缓存等数据。 它特别在 Java 虚拟机规范对它的约束⾮常宽松,所以⽅法区的具体实现历经了许多变迁,例如 jdk1.7 之前使⽤永 久代作为⽅法区的实现。 3.说⼀下 JDK1.6 、1.7、1.8 内存区域的变化? JDK1.6 、1.7/1.8 内存区域发⽣了变化,主要体现在⽅法区的实现: JDK1.6 使⽤永久代实现⽅法区: JDK1.7 时发⽣了⼀些变化,将字符串常量池、静态变量,存放在堆上 在 JDK1.8 时彻底⼲掉了永久代,⽽在直接内存中划出⼀块区域作为元空间,运⾏时常量池、类常量池都移动 到元空间。 4.为什么使⽤元空间替代永久代作为⽅法区的实现? Java 虚拟机规范规定的⽅法区只是换种⽅式实现。有客观和主观两个原因。 客观上使⽤永久代来实现⽅法区的决定的设计导致了 Java 应⽤更容易遇到内存溢出的问题(永久代有-XX : MaxPermSize 的上限,即使不设置也有默认⼤⼩,⽽ J9 和 JRockit 只要没有触碰到进程可⽤内存的上限,例 如 32 位系统中的 4GB 限制,就不会出问题),⽽且有极少数⽅法 (例如 String::intern())会因永久代的原 因⽽导致不同虚拟机下有不同的表现。 主观上当 Oracle 收购 BEA 获得了 JRockit 的所有权后,准备把 JRockit 中的优秀功能,譬如 Java Mission Control 管理⼯具,移植到 HotSpot 虚拟机时,但因为两者对⽅法区实现的差异⽽⾯临诸多困难。考虑到

文档评论(0)

jayjiao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

认证主体焦**

1亿VIP精品文档

相关文档

相关课程推荐