- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
2025年高频javajvm面试题及答案
1.JVM内存区域划分
问题:请详细描述JVM内存区域的划分。
答案:JVM内存区域主要分为线程私有区域和线程共享区域。
线程私有区域
程序计数器:它是一块较小的内存空间,可看作是当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器,当线程执行Java方法时,记录的是正在执行的虚拟机字节码指令的地址;若执行的是本地(Native)方法,计数器值则为空(Undefined)。此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
虚拟机栈:每个Java线程都有一个私有的虚拟机栈,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放了编译期可知的各种基本数据类型(如int、float等)、对象引用(reference类型)和returnAddress类型(指向了一条字节码指令的地址)。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存,会抛出OutOfMemoryError异常。
本地方法栈:与虚拟机栈类似,本地方法栈为虚拟机使用到的Native方法服务。有的虚拟机(如SunHotSpot虚拟机)直接把本地方法栈和虚拟机栈合二为一。同样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
线程共享区域
堆:Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此也被称为“GC堆”。根据垃圾回收的分代策略,Java堆可以细分为新生代和老年代,新生代又可进一步分为Eden空间、FromSurvivor空间和ToSurvivor空间。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
方法区:方法区也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在HotSpot虚拟机中,方法区也被称为“永久代”,但从Java8开始,永久代被元空间(Metaspace)取代。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
运行时常量池:它是方法区的一部分,用于存放编译期提供的各种字面量和符号引用。运行时常量池相对于Class文件常量池的一个重要特征是具备动态性,Java语言并不要求常量一定只能在编译期产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。
2.垃圾回收机制
问题:简述垃圾回收的基本概念和主要算法。
答案:垃圾回收(GarbageCollection,简称GC)是一种自动内存管理机制,其主要目的是回收不再使用的内存空间,防止内存泄漏,提高内存的使用效率。
判断对象是否存活的算法
引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。但是,引用计数算法很难解决对象之间相互循环引用的问题,因此主流的Java虚拟机都没有使用这种算法来判断对象是否存活。
可达性分析算法:这个算法的基本思路是通过一系列称为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连时,则证明此对象是不可用的。可作为GCRoots的对象包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(即一般说的Native方法)引用的对象等。
垃圾回收算法
标记清除算法:这是最基础的垃圾回收算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。该算法的主要缺点是效率问题,标记和清除过程的效率都不高;另外,会产生大量不连续的内存碎片,可能导致在后续为大对象分配内存时无法找到足够的连续内存而提前触发另一次垃圾回收动作。
标记
原创力文档


文档评论(0)