面试必杀技:彻底搞懂 JVM 内存模型与区域划分(上篇)
在 Java 面试中JVMJava 虚拟机是区分中高级开发者的分水岭。很多同学对 JVM 感到恐惧觉得它只是一堆干巴巴的概念。其实只要把它当成一个“虚拟的操作系统”一切就豁然开朗了。本系列将分为上、中、下三篇带你彻底吃透 JVM 面试题。今天我们先从最基础也是最核心的**运行时数据区内存模型**开始剖析核心考点一JVM 内存到底是怎么划分的JVM 在执行 Java 程序时会把它管理的内存划分为五个经典的区域。按照线程是否共享可以分为两大类1. 线程私有区域每个线程人手一份随线程生灭程序计数器Program Counter Register通俗理解可以理解为当前线程执行代码的“行号指示器”。就像看书时的书签记录你读到了哪一页。CPU 切换线程时就是靠它恢复进度。特点占用内存极小是 JVM 中**唯一一个不会发生 OOM内存溢出**的区域。Java 虚拟机栈JVM Stack通俗理解Java 方法执行的舞台。每个方法一执行就会在栈里压入一个“栈帧”存局部变量、操作数栈、动态链接等。方法结束了栈帧就弹出来。报错场景递归调用太深会引发StackOverflowError如果栈允许动态扩展却申请不到足够内存会引发OutOfMemoryError。本地方法栈Native Method Stack通俗理解和虚拟机栈非常像只不过它服务的是带有native关键字的方法比如调用底层 C/C 库。2. 线程共享区域大家共用一块地儿存在并发竞争堆内存Java Heap绝对的主力通俗理解全 JVM 最大的一块内存几乎所有被new出来的对象实例和数组都住在这里。它是垃圾回收GC的重点照顾对象。时代变迁在 JDK 1.8 之前堆中分为新生代、老年代和永久代方法区的实现 JDK 1.8 之后永久代被移除方法区移到了本地内存的**元空间MetaSpace**中。方法区Method Area通俗理解这是一个“逻辑概念”用来存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等“死规矩”。落地实现JDK 1.7 的落地实现叫“永久代”在堆里JDK 1.8 之后落地实现叫“元空间”在本地内存里。核心考点二字符串常量池去哪儿了版本变迁必考这是一个极具区分度的连环坑面试官特别爱问字符串常量池在哪JDK 1.6 及之前字符串常量池在**方法区永久代**中。JDK 1.7字符串常量池和静态变量被挪到了Java 堆当中。因为永久代 GC 效率太低而字符串会大量生成放在堆里能被更快回收。JDK 1.8 及之后永久代直接被砍掉变成了元空间放在直接内存中。但是字符串常量池依然老老实实呆在 Java 堆里。核心考点三堆和栈的区别究竟是什么通俗举例假如你在方法里写了Object obj new Object();这里的obj作为一个局部变量引用就是个门牌号它存在虚拟机栈里。这里的new Object()作为一个真真切切的实例对象大房子它存在堆里。栈管运行活儿怎么干堆管存储东西存哪。维度堆 (Heap)栈 (Stack)功能存放对象实例、数组存放局部变量、方法执行状态共享性所有线程共享线程私有速度较慢需要 GC 计算极快随方法调用自动压栈/弹栈异常类型容易报OutOfMemoryError(OOM)容易报StackOverflowError面试高分背诵总结篇当面试官让你介绍一下 JVM 的内存区域时抛出以下话术“面试官您好JVM 的多线程运行时数据区主要分为五大块可以按照‘线程共享’和‘线程私有’来划分。线程私有的包含三块程序计数器唯一不抛 OOM 的区域用于记录代码行号、虚拟机栈负责 Java 方法的执行任务存储局部变量表等栈帧信息、本地方法栈服务 Native 方法。线程共享的包含两块一块是 Java 堆它是内存占用最大、也是 GC 主要负责的区域专门存放对象实例和数组另一块是方法区存储类信息、静态变量和运行池常量池。特别需要注意的是历史版本的演进JDK 1.7 把字符串常量池从方法区移到了堆里而 JDK 1.8 彻底废弃了永久代采用了使用本地直接内存的‘元空间’来实现方法区这不仅解决了永久代容易 OOM 的问题也使得 GC 更加高效。”掌握这套话术JVM 面试的开局你已稳拿满分接下来请期待中篇垃圾回收机制大揭秘。点赞收藏随时复盘大厂 Offer 拿到手软
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2425830.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!