【JAVA面试】JVM

这篇具有很好参考价值的文章主要介绍了【JAVA面试】JVM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章先作为初版,等后续时间充足后,补充更深的内容


JVM

一、垃圾回收算法

JVM中的垃圾回收算法可以分为两种类型:基于引用计数的垃圾回收算法和基于可达性分析的垃圾回收算法。目前主流的JVM垃圾回收算法都是基于可达性分析的。

引用计数算法
引用计数算法是一种简单的垃圾回收算法,它的原理是通过计数来判断对象是否为垃圾对象。每个对象都有一个引用计数器,当有一个指针指向该对象时,引用计数器就会加1,当指针失效时,引用计数器就会减1。当引用计数器的值为0时,就可以判定该对象为垃圾对象。然而,这种算法有一个明显的问题,就是无法解决循环引用的问题,即两个对象互相引用的情况

可达性分析算法
可达性分析算法是现代JVM垃圾回收算法的主流算法,它的基本思路是通过一系列称为“GC Roots”的根对象作为起点,从这些对象开始遍历整个对象图,能够到达的对象就是存活对象,不能到达的对象就是垃圾对象。根对象包括虚拟机栈中的引用对象、方法区中类静态属性引用的对象和常量引用的对象等。

可达性分析算法具有以下特点:

它可以有效地解决循环引用的问题。
它可以通过多种不同的算法实现,例如标记-清除算法、复制算法、标记-整理算法和分代算法等。
它需要暂停应用程序的执行,以便进行垃圾回收,因此可能会对程序的性能产生一定的影响。

常见的垃圾回收算法包括:

标记-清除算法:该算法分为标记和清除两个阶段,首先标记出所有存活对象,然后清除所有未标记的对象。这种算法比较简单,但是有个很严重的问题,会产生大量的内存碎片
复制算法:为了解决标记清除算法的内存碎片问题。该算法将内存分为两个区域,每次只使用其中一个区域,当一个区域满了之后,将其中所有存活对象复制到另一个区域,然后清空原来的区域。他的问题就在于浪费空间。而且,他的效率跟存活对象的个数有关。
标记压缩算法:为了解决复制算法的缺陷,就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是一样的,但是在完成标记之后,不是直接清理垃圾内存,而是将存活对象往一端移动,然后将边界以外的所有内存直接清除
标记-整理算法:标记-整理算法也是为了解决内存碎片问题。与标记-压缩算法不同的是,标记-整理算法在标记阶段后,会将所有存活对象移动到一端,然后直接清理边界以外的所有内存。移动对象的操作会产生内存的空洞,但是清理完毕之后,会将所有存活对象压缩到一起,使内存空间得到了整理。该算法将存活对象压缩到内存的一端,然后清除另一端的所有未被占用的内存空间。
分代算法:分代收集算法的核心思想是将堆内存分为不同的代,一般将新生代划分为 Eden 区、Survivor 区,老年代就是指存活时间较长的对象。新生代的对象由于生命周期短,所以采用复制算法老年代的对象则采用标记-整理或者标记-清除算法。

二、什么是STW

STW指的是Stop-The-World,即全局停顿。在Java应用程序运行的过程中,JVM需要对内存进行垃圾回收、线程栈整理、内存整理等操作,这些操作都需要暂停Java应用程序的执行,这就是STW。在STW期间,JVM会暂停所有线程的执行,包括用户线程和垃圾回收线程,直到垃圾回收等操作完成后才会继续执行。(只有在进行 **Full GC(全局垃圾回收)**时,JVM 才会暂停所有线程的执行,包括用户线程和垃圾回收线程,直到垃圾回收等操作完成后才会继续执行。这种情况下的停顿时间会比较长,可能会影响应用程序的性能和响应时间。而对于局部垃圾回收(如 Minor GC),JVM 只会暂停用户线程的执行,等待垃圾回收线程完成操作后再继续执行用户线程。这种情况下的停顿时间相对较短,不会对应用程序的性能和响应时间产生明显的影响。)

STW是为了保证垃圾回收的正确性而采取的一种措施。在垃圾回收期间,如果不停顿Java应用程序的执行,那么就有可能会产生一些问题,比如对象的引用关系会发生变化,而正在执行的线程可能会访问到不一致的对象状态,导致应用程序出现不可预知的错误。因此,在进行垃圾回收等操作时,必须要停顿Java应用程序的执行,以保证数据的一致性

STW时间的长短和频率对Java应用程序的性能影响很大,因此,JVM一直在不断优化垃圾回收算法和机制,以减少STW的时间和频率

三、JVM参数

JVM参数分为标准参数和非标准参数两类。标准参数是指在所有JVM实现中都必须支持的参数,非标准参数是指在某些JVM实现中才会支持的参数。

标准参数包括:
-classpath或-cp:指定类路径,多个路径之间用冒号或分号分隔(Linux或Windows环境下分别使用不同的分隔符)。
-version:输出当前JVM的版本信息。
-help:输出JVM的命令行帮助信息。
-Xms:指定JVM堆的初始大小。
-Xmx:指定JVM堆的最大大小。
-Xss:指定每个线程的栈空间大小。
-Xmn:指定新生代的大小。
-XX:+UseParallelGC:指定使用并行垃圾回收器。
-XX:+UseConcMarkSweepGC:指定使用CMS垃圾回收器。
-XX:+UseG1GC:指定使用G1垃圾回收器。

非标准参数包括:
-XX:+HeapDumpOnOutOfMemoryError:在内存溢出时自动生成堆转储快照。
-XX:MaxPermSize:指定永久代的最大大小(JDK 8及以上不支持)。
-XX:MaxMetaspaceSize:指定元空间的最大大小(JDK 8及以上使用)。
-XX:PrintGCDetails:打印GC详细信息。
-XX:SurvivorRatio:指定新生代中Eden区和Survivor区的比例。
-XX:PermSize:指定永久代的初始大小(JDK 8及以上不支持)。
-XX:MetaspaceSize:指定元空间的初始大小(JDK 8及以上使用)。

四、JVM内存模型

【JAVA面试】JVM
JVM内存模型指的是Java虚拟机运行时使用的内存模型,它将内存分为不同的区域,每个区域有不同的作用和生命周期。这些区域包括:

程序计数器(Program Counter Register):线程私有,记录当前线程执行的字节码行号,用于支持线程切换和异常处理。

虚拟机栈(Java Virtual Machine Stacks):线程私有,每个方法在执行时会创建一个栈帧,用于保存方法的局部变量、操作数栈、动态链接、方法出口等信息。栈帧随着方法的执行压入和弹出虚拟机栈,如果虚拟机栈的空间不足,会抛出StackOverflowError,如果虚拟机栈可以动态扩展但无法申请到足够的内存空间,会抛出OutOfMemoryError。

本地方法栈(Native Method Stack):和虚拟机栈的作用相似,只不过是为本地方法服务的。

堆(Heap)线程共享,用于存储Java对象实例。Java虚拟机启动时会分配一块固定大小的堆空间,可以通过设置-Xmx和-Xms来调整堆的大小。如果堆中没有足够的空间分配新的对象,会触发垃圾回收,如果垃圾回收后仍然无法获得足够的空间,会抛出OutOfMemoryError。

方法区(Method Area)线程共享用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区也被称为永久代(Permanent Generation),在JDK8及以后的版本中,被移除并被称为元空间(Metaspace)。

运行时常量池(Runtime Constant Pool):方法区的一部分,用于存储编译时生成的各种字面量和符号引用。每个类或接口都有一个运行时常量池,用于支持类或接口的运行。

直接内存(Direct Memory):JVM管理的堆外内存,通过DirectByteBuffer来进行操作,也被称为NIO堆外内存。由于堆外内存不受JVM内存限制的控制,因此可能导致系统内存的不足。文章来源地址https://www.toymoban.com/news/detail-437627.html


到了这里,关于【JAVA面试】JVM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面试汇总——jvm篇

    目录 JVM的组成: 1、JVM 概述(⭐⭐⭐⭐) 1.1 JVM是什么? 1.2 JVM由哪些部分组成,运行流程是什么? 2、什么是程序计数器?(⭐⭐⭐⭐) 3、介绍一下Java的堆(⭐⭐⭐⭐) 4、虚拟机栈(⭐⭐⭐⭐) 4.1 什么是虚拟机栈? 4.2 垃圾回收是否涉及栈内存? 4.3 栈帧内存分配越大越好吗? 4.4

    2024年01月17日
    浏览(29)
  • Java面试题:为什么HashMap不建议使用对象作为Key?

    HashMap 是一种基于哈希表的动态数据结构,它允许使用任意不可变对象作为键(key)来存储和检索数据。然而,在某些情况下,使用对象作为 HashMap 的键可能会遇到一些问题。   首先,我们需要明确对象作为 HashMap 的键需要满足一些条件: 不可变性:对象的属性不能被修改,

    2024年04月22日
    浏览(32)
  • JAVA 学习 面试(三)JVM篇

    JAVA虚拟机(JVM) JDK、JRE、JVM的关系 JDK JRE = Java虚拟机 + Java核心类库 JVM组成结构: (1)类加载器 (2)运行时数据区 (3)执行引擎 (4)本地库接口 类加载器 Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进

    2024年01月22日
    浏览(31)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(34)
  • 大厂面试题一文讲通jvm,Java虚拟机高频面试题

    薪资范围:6-16K 一个类完整的生命周期,会经历五个阶段,分别为: 加载、连接、初始化、使用 、和 卸载 。其中的连接又分为 验证、准备 和 解析 三个步骤。如下图所示 加载(Loading) 简单一句话概括,类的加载阶段就是: 找到需要加载的类并把类的信息加载到jvm的方法

    2024年01月18日
    浏览(31)
  • JAVA工程师面试专题-JVM篇

    目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、垃

    2024年02月21日
    浏览(29)
  • JVM篇--Java内存区域高频面试题

    首先我们要知道java堆空间的产生过程: 即当通过java命令启动java进程的时候,就会为它分配内存,而分配内存的一部分就会用于创建堆空间,而当程序中创建对象的时候 就会从堆空间来分配内存,所以堆空间存放的主要是对象和数组; 而GC 其实说白了就是java虚拟机回收对象

    2024年02月01日
    浏览(38)
  • java八股文面试[JVM]——元空间

    JAVA8为什么要增加元空间 为什么要移除永久代?    知识来源: 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili

    2024年02月11日
    浏览(36)
  • java八股文面试[JVM]——垃圾回收

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收 面试题: JVM内存模型 以及分区,需要详细到每个区放什么 堆里面的分区:Eden,survival from to,老年代,各自的特点。 GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方 针

    2024年02月11日
    浏览(30)
  • java八股文面试[JVM]——双亲委派模型

    1.当 AppClassLoader 去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器 ExtClassLoader 去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载器 BootstrapClassLoader 去完成。 3.如果BootstrapClas

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包