面试JVM模型
1、内存区域划分:
DK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。
2、
3、判断对像是否存活的算法
引用计数算法:
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效,计数器-1.任何时刻计数器为0的对象就是不可能再被使用的。
优点:实现简单,判定效率高效,被actionscript3和python中广泛应用。
缺点:无法解决对象之间的相互引用问题。java没有采纳
可达性分析算法:
通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连的时候,则证明此对象是不可用的。
比如如下,右侧的对象是到GCRoot时不可达的,可以判定为可回收对象。
在java中,可以作为GCRoot的对象包括以下几种:
* 虚拟机栈中引用的对象。
* 方法区中静态属性引用的对象。
* 方法区中常量引用的对象。
* 本地方法中JNI引用的对象。
即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize 方法。当对象没有覆盖 finalize 方法,或 finalize 方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。
被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。
---------------------
4、常用的垃圾收集算法
标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如下图所示。标记-清除算法不需要进行对象的移动,只需对不存活的对象进行处理,在存活对象比较多的情况下极为高效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎片。
复制算法的提出是为了克服句柄的开销和解决内存碎片的问题。它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集合(GC Roots)中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。
标记-整理算法(Mark-compact)
标记-整理算法采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题
分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
3.4.1 年轻代(Young Generation)的回收算法 (回收主要以Copying为主)
a) 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
b) 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。
c) 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC(Major GC),也就是新生代、老年代都进行回收。
d) 新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)。
3.4.2 年老代(Old Generation)的回收算法(回收主要以Mark-Compact 标记-整理 为主)
可以参考 https://blog.csdn.net/en_joker/article/details/79741737
a) 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
b) 内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。
c) 大对象直接进入老年代
因为新生代是使用的复制算法,所以要尽量减少复制的内存,所以对象内存到一定的值后就会直接进入老年代
====================================================
永久代(JDK1.7)
在 JDK 1.8 之前,所加载的类信息都放在永久代中。我们用 -XX:PermSize 设置永久代初始大小,用 -XX:MaxPermSize 设置永久代最大大小。
java -XX:PermSize10m -XX:MaxPermSize50m -XX:+PrintGCDetails GCDemo
JDK1.8 之时,永久代被移除,取而代之的是元空间(Metaspace)。在元空间这块内存中,有两个参数很相似,它们是: -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize。
java -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=50m -XX:+PrintGCDetails GCDemo
内存设置参数:
-Xms | 初始堆大小 |
-Xmx | 最大堆空间 |
-Xmn | 设置新生代大小 |
-XX:SurvivorRatio | 设置新生代eden空间和from/to空间的比例关系 |
-XX:PermSize | 方法区初始大小 |
-XX:MaxPermSize | 方法区最大大小 |
-XX:MetaspaceSize | 元空间GC阈值(JDK1.8) |
-XX:MaxMetaspaceSize | 最大元空间大小(JDK1.8) |
-Xss | 栈大小 |
-XX:MaxDirectMemorySize | 直接内存大小,默认为最大堆空间 |
JDK1.7中,已经把放在永久代的字符串常量池移到堆中。
JDK1.8撤销永久代,引入元空间。
相关推荐
【JVM面试题详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行Java应用程序并提供跨平台的兼容性。对于Java开发者来说,深入理解JVM的工作原理是面试中不可或缺的一部分。以下是一些关于JVM的常见面试...
这些只是JVM面试题的一部分,实际面试中可能会涉及更深入的问题,如JVM内存模型的细节、JIT编译器、内存溢出问题的处理等。通过深入学习和实践,开发者可以更好地理解和优化JVM,提升Java应用的性能和稳定性。
以下是对JVM内存模型及面试常见问题的详细解释: 1. **内存模型及分区** - **方法区(Method Area)**:存储类信息、常量池(包括static常量和static变量)、编译后的字节码等数据。在Java 8中,方法区被替换为...
此思维导图里面包括了JVM面试的常用知识点,当然包括了内存模型 博主还写了一个JVM的专栏,小伙伴们感兴趣可以去看看 https://blog.csdn.net/u014534808/category_9621854.html jvm内存模型 博主是一名工作多年的老...
了解并熟练掌握这些JVM调优和Linux操作的知识点,不仅可以帮助你在面试中脱颖而出,也能在实际工作中有效提升问题解决效率,确保系统稳定运行。在面对复杂的系统问题时,能够迅速定位并解决,对于提升IT职业素养至关...
在Java面试中,JVM相关的知识经常是考察的重点,因为它直接关系到程序的性能优化和内存管理。以下是对21个常见Java面试题_JVM问题的详细解释: 1. **JVM结构**:JVM由类装载器、运行数据区、执行引擎、本地方法接口...
面试中,JVM的常见问题通常涉及内存模型、内存溢出、垃圾收集(GC)等主题。以下是对这些知识点的详细解析: 1. 栈内存溢出:栈内存主要存放方法调用时的局部变量表、操作数栈、动态链接和方法返回地址。当线程请求...
### 面试必问之JVM与性能优化——关键知识点解析 #### 一、JVM加载Class文件的原理机制 在Java开发过程中,深入理解JVM如何加载Class文件至关重要,尤其是在面试时,这一知识点往往是考察的重点之一。下面将详细...
Java面试中的JVM(Java虚拟机)和多线程是两个关键的知识领域,对于求职者来说,掌握这两点能够显著提升面试成功率。JVM是Java程序的运行平台,它负责解释执行字节码,实现跨平台运行。多线程则是Java编程中实现并发...
java技术面试必问:JVM-内存模型讲解 本文将详细介绍Java技术面试中必问的JVM内存模型讲解。Java程序的执行过程包括java文件编译、类加载、字节码执行等步骤。在整个加载过程中,JVM使用一段空间来存储程序执行期间...
【标题】"JVM面试题 PDD 下载"所涉及的知识点主要集中在Java虚拟机(JVM)上,这是Java编程中的核心部分,对于开发者尤其是面试者来说,深入理解JVM至关重要。PDD可能指的是“问题、解答、讨论”或者“拼多多”(PDD...
系统和JVM调优是Java开发人员在面试中经常遇到的话题,这关乎程序性能优化、内存管理和稳定性。本文将深入探讨这两个关键领域的核心概念,并提供一些实战策略。 首先,我们来了解一下系统调优。系统调优主要包括...
标题提到的是"Java面试题、JVM面试题、多线程面试题",而描述和标签却提及"python编程"。不过,既然您希望聚焦于"Java面试题、JVM面试题、多线程面试题",我将为您详细介绍这些主题。 **Java面试题** 1. **Java是...
JVM在面试中是一个常见的考察点,特别是对于Java开发人员而言,理解JVM的工作原理和性能优化技巧至关重要。本专题将围绕JVM的面试知识点进行深入探讨。 首先,我们要了解JVM的内存结构,这包括堆内存(Heap)、方法...
在Java面试中,JVM相关知识是必不可少的一部分,因为理解JVM的工作原理和调优技巧对于开发高效、稳定的Java应用至关重要。下面将详细阐述JVM的一些核心概念和面试常考知识点。 1. **类加载机制**:Java程序的运行...
面试中关于JVM的常见问题通常集中在内存模型、垃圾收集(GC)、对象分配和类加载等方面。以下是对这些知识点的详细解释: 1. **内存模型及分区**: - **方法区(Method Area)**:存储类信息,如类名、方法信息、...
- 类加载优化:如延迟加载(Lazy Loading)和双亲委派模型。 - 内存调整:设置合理的堆大小、栈大小和方法区大小,以适应不同应用的需求。 - 垃圾收集器选择和调优:如Serial、Parallel、CMS、G1等,根据应用场景...
Java虚拟机(JVM)是Java程序运行的核心,对于Java开发工程师来说,深入理解JVM是面试中的必备技能。这份“Java JVM面试必备八股文”涵盖了JVM的基础知识、垃圾回收(GC)机制和类加载机制等关键点,旨在帮助准备...