精华内容
下载资源
问答
  • jvm内存结构面试题
    2022-03-31 15:54:40

    本文参考:

    > https://blog.csdn.net/xy3233/article/details/108296943
    > https://www.cnblogs.com/yichunguo/p/12007038.html
    

    JAVA内存模型(Java Memory Model,JMM) 是一种虚拟机规范,用于屏蔽各种硬件和操作系统的内存访问差异。
    JMM解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

    jvm: java虚拟机
    jvm内存结构:
    栈: 线程私有, 用于存放局部变量, 方法出口等(jdk1.8将运行时常量池,静态变量也存储在堆中)
    堆: 存放对象实例以及数组, 分为新生代和老年代,垃圾回收的主要区域
    程序计数器: 保存程序当前执行地址(或者说下一条指令的地址)
    方法区: 存储类加载信息. 编译后的代码等,JDK1.8之前方法区由"永久代"实现,使用的是JVM内存, JDK1.8之后使用的是系统内存,被叫做"元空间"

    垃圾回收:
    垃圾回收发生场所
    (1) 堆: ①新生代 ②老年代
    (2)元空间
    垃圾回收触发条件:
    Minor GC:对新生代进行回收,不影响老年代, minorGC非常频繁.
    Full GC 也叫 Major GC: 老年代满了,永久代(元空间)满了,System.gc()被显示调用
    垃圾回收算法:
    ①: 标积清除: 清除所有未被标积的对象,适用于存活对象较多的情况。(老年代)
    ② 标积整理: 将活着的对象移动到一端,然后清除边界一外的地方
    ③ 复制算法,将活着的对象复制到另一边空着的区域,然后清除本区域

    性能调优:
    对JVM调优主要目的是: 减少GC频率和FullGC的次数
    查看是否需要调优:
    ① 可以使用JVM工具(Jmap+mat)监控当前日志,JVM参数,分析内存快照,GC日志等
    ② 导出dumo文件用于分析

    更多相关内容
  • 前言 很多人面试之前,可能没有在互联网公司...下述是我收录整理的Android面试题汇总,由于篇幅原因,在这只把(String、StringBuilder、StringBuffer)+JVM内存结构部分的题目列举出来,后续还会更新其余面试题内容...

    前言

    很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。

    下述是我收录整理的Android面试题汇总,由于篇幅原因,在这只把(String、StringBuilder、StringBuffer)+JVM内存结构部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

    一、String、StringBuilder、StringBuffer

    StringBuffer里面的很多方法添加了synchronized关键字,是可以表征线程安全的,所以多线程情况下使用它。

    执行速度:

    StringBuilder > StringBuffer > String
    

    StringBuilder牺牲了性能来换取速度的,这两个是可以直接在原对象上面进行修改,省去了创建新对象和回收老对象的过程,而String是字符串常量(final)修试,另外两个是字符串变量,常量对象一旦创建就不可以修改,变量是可以进行修改的,所以对于String字符串的操作包含下面三个步骤:

    1. 创建一个新对象,名字和原来的一样
    2. 在新对象上面进行修改
    3. 原对象被垃圾回收掉

    二、JVM内存结构

    Java对象实例化过程中,主要使用到虚拟机栈、Java堆和方法区。Java文件经过编译之后首先会被加载到jvm方法区中,jvm方法区中很重的一个部分是运行时常量池,用以存储class文件类的版本、字段、方法、接口等描述信息和编译期间的常量和静态常量。

    2.1、JVM基本结构

    类加载器classLoader,在JVM启动时或者类运行时将需要的.class文件加载到内存中。 执行引擎,负责执行class文件中包含的字节码指令。 本地方法接口,主要是调用C/C++实现的本地方法及返回结果。 内存区域(运行时数据区),是在JVM运行的时候操作所分配的内存区, 主要分为以下五个部分,如下图:

    • 方法区:用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。
    • Java堆(heap):存储Java实例或者对象的地方。这块是gc的主要区域。
    • Java栈(stack):Java栈总是和线程关联的,每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈。在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是线程私有的。
    • 程序计数器:用于保存当前线程执行的内存地址,由于JVM是多线程执行的,所以为了保证线程切换回来后还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。
    • 本地方法栈:和Java栈的作用差不多,只不过是为JVM使用到的native方法服务的。

    以上就是Android (String、StringBuilder、StringBuffer)+JVM内存结构的面试题目,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

    Android架构师之路很漫长,一起共勉吧!

    展开全文
  • JVM内存结构面试问题及解答

    千次阅读 2019-08-07 10:24:17
    以下是jvm内存的常见面试问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时内存的时候有什么区别? 3、运行时数据区中哪些区域是线程共享的?哪些是独享的? 4、除了JVM运行时内存以外,还有什么...

    以下是jvm内存的常见面试问题:

    1、JVM管理的内存结构是怎样的?

    2、不同的虚拟机在实现运行时内存的时候有什么区别?

    3、运行时数据区中哪些区域是线程共享的?哪些是独享的?

    4、除了JVM运行时内存以外,还有什么区域可以用吗?

    5、堆和栈的区别是什么?

    6、Java中的数组是存储在堆上还是栈上的?

    7、Java中的对象创建有多少种方式?

    8、Java中对象创建的过程是怎么样的?

    9、Java中的对象一定在堆上分配内存吗?

    10、如何获取堆和栈的dump文件?

    以上10道题,如果您可以全部准确无误的回答的话,那说明你真的很了解JVM的内存结构以及内存分配相关的知识了,如果有哪些知识点是不了解的,那么本文正好可以帮你答疑解惑。
    Q1:JVM管理的内存结构是怎样的?
    Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。《Java虚拟机规范》中规定了JVM所管理的内存需要包括一下几个运行时区域:
    在这里插入图片描述

    Java虚拟机运行时数据区域主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。

    各个区域有各自不同的作用,关于各个区域的作用就不在本文中相信介绍了。

    但是,需要注意的是,上面的区域划分只是逻辑区域,规范对于有些区域的限制是比较松的,所以不同的虚拟机厂商在实现上,甚至是同一款虚拟机的不同版本也是不尽相同的。

    Q2:不同的虚拟机在实现运行时内存的时候有什么区别?

    前面提到过《Java虚拟机规范》定义的JVM运行时所需的内存区域,不同的虚拟机实现上有所不同,而在这么多区域中,规范对于方法区的管理是最宽松的,规范中关于这部分的描述如下:

    方法区在虚拟机启动的时候创建,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。本版本的规范也不限定实现方法区的内存位置和代码编译的管理策略。方法区的容量可以是固定的,也可以随着程序执行的需求动态扩展,并在不需要过多的空间时自行收缩。方法区在实际内存空间站可以是不连续的。

    这一规定,可以说是给了虚拟机厂商很大的自由。

    虚拟机规范对方法区实现的位置并没有明确要求,在最著名的HotSopt虚拟机实现中(在Java 8 之前),方法区仅是逻辑上的独立区域,在物理上并没有独立于堆而存在,而是位于永久代中。所以,这时候方法区也是可以被垃圾回收的。

    实践证明,JVM中存在着大量的声明短暂的对象,还有一些生命周期比较长的对象。为了对他们采用不同的收集策略,采用了分代收集算法,所以HotSpot虚拟机把的根据对象的年龄不同,把堆分位新生代、老年代和永久代。

    在Java 8中 ,HotSpot虚拟机移除了永久代,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)
    在这里插入图片描述

    Q3:运行时数据区中哪些区域是线程共享的?哪些是独享的?
    在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。

    而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还未每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。(TLAB介绍)

    Q4:除了JVM运行时内存以外,还有什么区域可以用吗?

    除了我们前面介绍的虚拟机运行时数据区以外,还有一部分内存也被频繁使用,他不是运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,他就是——直接内存。

    直接内存的分配不受Java堆大小的限制,但是他还是会收到服务器总内存的影响。

    在JDK 1.4中引入的NIO中,引入了一种基于Channel和Buffer的I/O方式,他可以使用Native函数直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的应用进行操作。
    在这里插入图片描述

    Q5:堆和栈的区别是什么?
    堆和栈(虚拟机栈)是完全不同的两块内存区域,一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:

    堆中主要存放对象实例。
    栈(局部变量表)中主要存放各种基本数据类型、对象的引用。

    Q6:Java中的数组是存储在堆上还是栈上的?

    在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;

    所以,数组的实例是保存在堆中,而数组的引用是保存在栈上的。
    在这里插入图片描述

    Q7:Java中的对象创建有多少种方式?

    Java中共有5种方式可以创建一个对象。

    最简单的方式就是使用new关键字。

    User user = new User();
    

    除此以外,还可以使用反射机制创建对象:

    User user = User.class.newInstance();
    

    或者使用Constructor类的newInstance:

    Constructor<User> constructor = User.class.getConstructor();
    User user = constructor.newInstance();
    

    除此之外还可以使用clone方法和反序列化的方式,这两种方式不常用并且代码比较复杂,就不在这里展示了,感兴趣的可以自行了解下。

    Q8:Java中对象创建的过程是怎么样的?

    对于一个普通的Java对象的创建,大致过程如下:

    1、虚拟机遇到new指令,到常量池定位到这个类的符号引用。
    2、检查符号引用代表的类是否被加载、解析、初始化过。
    3、虚拟机为对象分配内存。
    4、虚拟机将分配到的内存空间都初始化为零值。
    5、虚拟机对对象进行必要的设置。
    6、执行方法,成员变量进行初始化。

    Q9:Java中的对象一定在堆上分配内存吗?

    前面我们说过,Java堆中主要保存了对象实例,但是,随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。

    其实,在编译期间,JIT会对代码做很多优化。其中有一部分优化的目的就是减少内存堆分配压力,其中一种重要的技术叫做逃逸分析。

    如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。(关于逃逸分析和栈上分配可以参考:深入理解Java中的逃逸分析、对象并不一定都是在堆上分配内存的)

    Q10:怎么如何获取堆和栈的dump文件?

    Java Dump,Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。

    可以使用在服务器上使用jmap命令来获取堆dump,使用jstack命令来获取线程的调用栈dump。(关于jmap和jstack可以参考:Java命令学习系列(三)——Jmap、Java命令学习系列(二)——Jstack)

    以上,就是本文的全部内容,对于其中的很多知识点,作者并未逐一展开,感兴趣的朋友可以自行学习一下,关于Java虚拟机相关知识,推荐三本书:《深入理解Java虚拟机》、《HotSpot实战》以及《Java虚拟机规范(第8版)》,本文中内容也参考了这三本书中很多内容。希望对你有帮助。

    文章转自公众号漫画编程,作者Hollis

    展开全文
  • 最新Jvm面试题总结及答案【附答案解析】Jvm面试题及答案2021,Jvm面试题最新面试题Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家...

    最新Jvm面试题总结及答案【附答案解析】Jvm面试题及答案2021,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝赐教,谢谢~

    如果不背 Jvm面试题的答案,肯定面试会挂!

    这套Jvm面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个面试手册,是PDF版的

    1、如何开启和查看 GC 日志?

    常见的 GC 日志开启参数包括:

    1、 -Xloggc:filename,指定日志文件路径

    2、 -XX:+PrintGC,打印 GC 基本信息

    3、 -XX:+PrintGCDetails,打印 GC 详细信息

    4、 -XX:+PrintGCTimeStamps,打印 GC 时间戳

    5、 -XX:+PrintGCDateStamps,打印 GC 日期与时间

    6、 -XX:+PrintHeapAtGC,打印 GC 前后的堆、方法区、元空间可用容量变化

    7、 -XX:+PrintTenuringDistribution,打印熬过收集后剩余对象的年龄分布信息,有助于 MaxTenuringThreshold 参数调优设置

    8、 -XX:+PrintAdaptiveSizePolicy,打印收集器自动设置堆空间各分代区域大小、收集目标等自动调节的相关信息

    9、 -XX:+PrintGCApplicationConcurrentTime,打印 GC 过程中用户线程并发时间

    10、 -XX:+PrintGCApplicationStoppedTime,打印 GC 过程中用户线程停顿时间

    11、 -XX:+HeapDumpOnOutOfMemoryError,堆 oom 时自动 dump

    12、 -XX:HeapDumpPath,堆 oom 时 dump 文件路径

    Java 9 JVM 日志模块进行了重构,参数格式发生变化,这个需要知道。

    GC 日志输出的格式,会随着上面的参数不同而发生变化。关注各个分代的内存使用情况、垃圾回收次数、垃圾回收的原因、垃圾回收占用的时间、吞吐量、用户线程停顿时间。

    借助工具可视化工具可以更方便的分析,在线工具 GCeasy;离线版可以使用 GCViewer。

    如果现场环境不允许,可以使用 JDK 自带的 jstat 工具监控观察 GC 情况。

    2、Parallel Scavenge 收集器(多线程复制算法、高效)

    Parallel Scavenge 收集器也是一个新生代垃圾收集器,同样使用复制算法,也是一个多线程的垃圾收集器, 它重点关注的是程序达到一个可控制的吞吐量(Thoughput, CPU 用于运行用户代码的时间/CPU 总消耗时间,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)),高吞吐量可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务。自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别。

    3、说下有哪些类加载器?

    Bootstrap ClassLoader(启动类加载器) Extention ClassLoader(扩展类加载器) App ClassLoader(应用类加载器)

    4、你做过 JVM 调优,说说如何查看 JVM 参数默认值?

    1、 jps -v 可以查看 jvm 进程显示指定的参数

    2、 使用 -XX:+PrintFlagsFinal 可以看到 JVM 所有参数的值

    3、 jinfo 可以实时查看和调整虚拟机各项参数

    5、什么是双亲委派机制?

    双亲委派机制的意思是除了顶层的启动类加载器以外,其余的类加载器,在加载之前,都会委派给它的父加载器进行加载。这样一层层向上传递,直到祖先们都无法胜任,它才会真正的加载。

    6、内存溢出和内存泄漏的区别?

    内存溢出 OutOfMemory,指程序在申请内存时,没有足够的内存空间供其使用。

    内存泄露 Memory Leak,指程序在申请内存后,无法释放已申请的内存空间,内存泄漏最终将导致内存溢出。

    7、强引用、软引用、弱引用、虚引用是什么,有什么区别?

    1、 强引用,就是普通的对象引用关系,如 String s = new String("ConstXiong")

    2、 软引用,用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。SoftReference 实现

    3、 弱引用,相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。WeakReference 实现

    4、 虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。PhantomReference 实现

    8、垃圾回收的优点和原理。说说2种回收机制

    Java 语言中一个显著的特点就是引入了垃圾回收机制,使 C++ 程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java 中的对象不再有“作用域”的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

    回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

    9、说一下垃圾分代收集的过程

    分为新生代和老年代,新生代默认占总空间的 1/3,老年代默认占 2/3。

    新生代使用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1。

    当新生代中的 Eden 区内存不足时,就会触发 Minor GC,过程如下:

    1、 在 Eden 区执行了第一次 GC 之后,存活的对象会被移动到其中一个 Survivor 分区;

    2、 Eden 区再次 GC,这时会采用复制算法,将 Eden 和 from 区一起清理,存活的对象会被复制到 to 区;

    3、 移动一次,对象年龄加 1,对象年龄大于一定阀值会直接移动到老年代

    4、 Survivor 区相同年龄所有对象大小的总和 (Survivor 区内存大小 * 这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。其中这个使用率通过 -XX:TargetSurvivorRatio 指定,默认为 50%

    5、 Survivor 区内存不足会发生担保分配

    6、 超过指定大小的对象可以直接进入老年代

    Major GC,指的是老年代的垃圾清理,但并未找到明确说明何时在进行Major GC

    FullGC,整个堆的垃圾收集,触发条件:

    1、 每次晋升到老年代的对象平均大小>老年代剩余空间

    2、 MinorGC后存活的对象超过了老年代剩余空间

    3、 元空间不足

    4、 System.gc() 可能会引起

    5、 CMS GC异常,promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成;concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成

    6、 堆内存分配很大的对象

    10、JVM 运行时内存

    Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年代。

    新生代

    是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden区、 ServivorFrom、 ServivorTo 三个区。

    Eden 区

    Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当 Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行一次垃圾回收。

    ServivorFrom

    上一次 GC 的幸存者,作为这一次 GC 的被扫描者。

    ServivorTo

    保留了一次 MinorGC 过程中的幸存者。

    MinorGC 的过程(复制->清空->互换)

    MinorGC 采用复制算法。

    eden、 servicorFrom 复制到 ServicorTo,年龄+1

    首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不够位置了就放到老年区);

    清空 eden、 servicorFrom

    然后,清空 Eden 和 ServicorFrom 中的对象;

    ServicorTo 和 ServicorFrom 互换

    最后, ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom区。

    11、ZGC 了解吗?

    JDK11 中加入的具有实验性质的低延迟垃圾收集器,目标是尽可能在不影响吞吐量的前提下,实现在任意堆内存大小都可以把停顿时间限制在 10ms 以内的低延迟。

    基于 Region 内存布局,不设分代,使用了读屏障、染色指针和内存多重映射等技术实现可并发的标记-整理,以低延迟为首要目标。

    ZGC 的 Region 具有动态性,是动态创建和销毁的,并且容量大小也是动态变化的。

    12、safepoint是什么?

    STW并不会只发生在内存回收的时候。现在程序员这么卷,碰到几次safepoint的问题几率也是比较大的。

    当发生GC时,用户线程必须全部停下来,才可以进行垃圾回收,这个状态我们可以认为JVM是安全的(safe),整个堆的状态是稳定的。

    如果在GC前,有线程迟迟进入不了safepoint,那么整个JVM都在等待这个阻塞的线程,造成了整体GC的时间变长。

    13、JVM 提供的常用工具

    jps:

    用来显示本地的 Java 进程,可以查看本地运行着几个 Java 程序,并显示他们的进程号。 命令格式:jps

    jinfo:

    运行环境参数:Java System 属性和 JVM 命令行参数,Java class path 等信息。 命令格式:jinfo 进程 pid

    jstat:

    监视虚拟机各种运行状态信息的命令行工具。 命令格式:jstat -gc 123 250 20

    jstack:

    可以观察到 JVM 中当前所有线程的运行情况和线程当前状态。 命令格式:jstack 进程 pid

    jmap:

    观察运行中的 JVM 物理内存的占用情况(如:产生哪些对象,及其数量)。 命令格式:jmap [option] pid

    14、CMS 收集器(多线程标记清除算法)

    Concurrent mark sweep(CMS)收集器是一种年老代垃圾收集器,其最主要目标是获取最短垃圾回收停顿时间, 和其他年老代使用标记-整理算法不同,它使用多线程的标记-清除算法。最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验。CMS 工作机制相比其他的垃圾收集器来说更复杂。整个过程分为以下 4 个阶段:

    初始标记

    只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。

    并发标记

    进行 GC Roots 跟踪的过程,和用户线程一起工作,不需要暂停工作线程。

    重新标记

    为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。

    并发清除

    清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作, 所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行。

    15、对象都是优先分配在年轻代上的吗?

    不是。当新生代内存不够时,老年代分配担保。而大对象则是直接在老年代分配。

    16、有哪些 GC 算法?

    标记-清除算法

    分为标记和清除阶段,首先从每个 GC Roots 出发依次标记有引用关系的对象,最后清除没有标记的对象。

    执行效率不稳定,如果堆包含大量对象且大部分需要回收,必须进行大量标记清除,导致效率随对象数量增长而降低。

    存在内存空间碎片化问题,会产生大量不连续的内存碎片,导致以后需要分配大对象时容易触发 Full GC。

    标记-复制算法

    为了解决内存碎片问题,将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当使用的这块空间用完了,就将存活对象复制到另一块,再把已使用过的内存空间一次清理掉。主要用于进行新生代。

    实现简单、运行高效,解决了内存碎片问题。代价是可用内存缩小为原来的一半,浪费空间。

    HotSpot 把新生代划分为一块较大的 Eden 和两块较小的 Survivor,每次分配内存只使用 Eden 和其中一块 Survivor。垃圾收集时将 Eden 和 Survivor 中仍然存活的对象一次性复制到另一块 Survivor 上,然后直接清理掉 Eden 和已用过的那块 Survivor。HotSpot 默认Eden 和 Survivor 的大小比例是 8:1,即每次新生代中可用空间为整个新生代的 90%。

    标记-整理算法

    标记-复制算法在对象存活率高时要进行较多复制操作,效率低。如果不想浪费空间,就需要有额外空间分配担保,应对被使用内存中所有对象都存活的极端情况,所以老年代一般不使用此算法。

    老年代使用标记-整理算法,标记过程与标记-清除算法一样,但不直接清理可回收对象,而是让所有存活对象都向内存空间一端移动,然后清理掉边界以外的内存。

    标记-清除与标记-整理的差异在于前者是一种非移动式算法而后者是移动式的。如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活的区域,是一种极为负重的操作,而且移动必须全程暂停用户线程。如果不移动对象就会导致空间碎片问题,只能依赖更复杂的内存分配器和访问器解决。

    17、有什么堆外内存的排查思路?

    进程占用的内存,可以使用top命令,看RES段占用的值。如果这个值大大超出我们设定的最大堆内存,则证明堆外内存占用了很大的区域。

    使用gdb可以将物理内存dump下来,通常能看到里面的内容。更加复杂的分析可以使用perf工具,或者谷歌开源的gperftools。那些申请内存最多的native函数,很容易就可以找到。

    18、SWAP会影响性能么?

    当操作系统内存不足的时候,会将部分数据写入到SWAP交换分中,但是SWAP的性能是比较低的。如果应用的访问量较大,需要频繁申请和销毁内存,就容易发生卡顿。一般高并发场景下,会禁用SWAP。

    19、你知道哪些JVM性能调优

    设定堆内存大小

    1、 -Xmx:堆内存最大限制。设定新生代大小。新生代不宜太小,否则会有大量对象涌入老年代

    2、 -XX:NewSize:新生代大小

    3、 -XX:NewRatio 新生代和老生代占比

    4、 -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比

    5、 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

    20、你都有哪些手段用来排查内存溢出?

    (这个话题很大,可以从实践环节中随便摘一个进行总结,下面举例一个最普通的)

    你可以来一个中规中矩的回

    内存溢出包含很多种情况,我在平常工作中遇到最多的就是堆溢出。有一次线上遇到故障,重新启动后,使用jstat命令,发现Old区在一直增长。我使用jmap命令,导出了一份线上堆栈,然后使用MAT进行分析。通过对GC Roots的分析,我发现了一个非常大的HashMap对象,这个原本是有位同学做缓存用的,但是一个无界缓存,造成了堆内存占用一直上升。后来,将这个缓存改成 guava的Cache,并设置了弱引用,故障就消失了。

    这个回答不是十分出彩,但着实是常见问题,让人挑不出毛病。

    21、类加载有几个过程?

    加载、验证、准备、解析、初始化。

    22、简述Java的对象结构

    Java对象由三个部分组成:对象头、实例数据、对齐填充。

    对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

    23、怎么查看服务器默认的垃圾回收器是哪一个?

    这通常会使用另外一个参数:-XX:+PrintCommandLineFlags可以打印所有的参数,包括使用的垃圾回收器。

    24、JAVA 强引用

    在 Java 中最常见的就是强引用, 把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。

    25、详细介绍一下JVM内存模型

    根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

    具体可能会聊聊jdk1.7以前的PermGen(永久代),替换成Metaspace(元空间)

    1、 原本永久代存储的数据:符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap

    2、 Metaspace(元空间)存储的是类的元数据信息(metadata)

    3、 元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。

    4、 替换的好处:一、字符串存在永久代中,容易出现性能问题和内存溢出。二、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

    26、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

    理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5GB,Solaris 大约3GB。64 位 JVM 允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

    27、HashMap中的key,可以是普通对象么?需要什么注意的地方?

    Map的key和value都可以是任何类型。但要注意的是,一定要重写它的equals和hashCode方法,否则容易发生内存泄漏。

    28、你熟悉哪些垃圾收集算法?

    标记清除(缺点是碎片化) 复制算法(缺点是浪费空间) 标记整理算法(效率比前两者差) 分代收集算法(老年代一般使用“标记-清除”、“标记-整理”算法,年轻代一般用复制算法)

    29、GC 垃圾收集器

    Java 堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法;年老代主要使用标记-整理垃圾回收算法,因此 java 虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器, JDK1.6 中 Sun HotSpot 虚拟机的垃圾收集器

    30、什么情况发生栈溢出?

    -Xss可以设置线程栈的大小,当线程方法递归调用层次太深或者栈帧中的局部变量过多时,会出现栈溢出错误 java.lang.StackOverflowError

    更多 JVM 面试题 60道

    01、标记清除算法( Mark-Sweep)

    02、Serial Old 收集器(单线程标记整理算法 )

    03、你都有哪些手段用来排查内存溢出?

    04、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?

    05、描述一下 JVM 加载 class 文件的原理机制

    06、能够找到 Reference Chain 的对象,就一定会存活么?

    07、类加载器双亲委派模型机制?

    08、字符串常量存放在哪个区域?

    09、你知道哪些内存分配与回收策略?

    10、Java 8 为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?

    11、谈谈永久代

    12、简述Java的对象结构

    13、SWAP会影响性能么?

    14、列举一些你知道的打破双亲委派机制的例子。为什么要打破?

    15、内存溢出和内存泄漏的区别?

    16、对于JDK自带的监控和性能分析工具用过哪些?

    17、Serial 垃圾收集器(单线程、 复制算法)

    18、GC垃圾回收算法与垃圾收集器的关系?

    19、方法区/永久代(线程共享)

    20、safepoint 是什么?

    21、什么是双亲委派机制?

    22、垃圾回收的优点和原理。说说2种回收机制

    23、程序计数器(线程私有)

    24、为什么需要双亲委派模式?

    25、介绍一下类文件结构吧!

    26、哪些是 GC Roots?

    27、MinorGC、MajorGC、FullGC 什么时候发生?

    28、方法区溢出的原因?

    29、如何判断对象可以被回收

    30、Java 中堆和栈有什么区别?

    31、双亲委派机制可以被违背吗?请举例说明。

    32、类的实例化顺序

    33、栈溢出的原因?

    34、如何判断一个常量是废弃常量 ?

    35、你知道哪些垃圾收集器?

    36、本地方法区(线程私有)

    37、说说 JVM 如何执行 class 中的字节码。

    38、分代收集算法

    40、怎么查看服务器默认的垃圾回收器是哪一个?

    41、OSGI( 动态模型系统)

    42、对象是怎么从年轻代进入老年代的?

    43、对象分配内存的方式有哪些?

    44、对象在哪块内存分配?

    45、类加载的过程是什么?

    46、谈谈 JVM 中的常量池

    47、ZGC 了解吗?

    48、生产上如何配置垃圾收集器的?

    49、对象都是优先分配在年轻代上的吗?

    50、模块化编程与热插拔

    51、程序计数器

    52、常用JVM基本配置参数

    53、创建对象的过程是什么?

    54、说说你知道的几种主要的JVM参数

    55、说说CMS垃圾收集器的工作原理

    56、在老年代-标记整理算法

    57、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    58、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

    59、你都用过G1垃圾回收器的哪几个重要参数?

    60、什么是方法内联?

    如果不背 Jvm面试题的答案,肯定面试会挂!

    这套Jvm面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个面试手册,是PDF版的

    展开全文
  • jvm内存结构; 栈的顺序:先进后出,栈中方法的顺序 jvm调优; 对象 对象的创建过程; 对象在内存中的存储布局; 对象头markword具体有什么: 对象的怎么定位,怎么通过引用找到他,有两个方法; 对象分配内存空间...
  • 2、JVM的体系结构 大多数将内存分配为Method Area(方法区)、Heap(堆)、Program Counter Register(程序计数器)、JAVA Method Stack(JAVA方法栈)、Native Method Stack(本地方法栈)。 3、类加载器 对象实例化过程 类...
  • JVM常见面试题

    2022-05-15 21:36:50
    1.JVM有哪些内存区域? 虚拟机栈:在jvm运行过程中存储当前线程运行方法所需的数据、指令、返回地址;栈的生命周期跟随线程的生命周期;每一个栈包含多个方法,每个方法占用一块空间,称为栈帧;它的结构是栈,是...
  • 总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。 1.什么情况下会发生栈内存溢出。 思路: 描述栈定义,再描述为什么会溢出,再说明一下...
  • JVM面试题(面试必备)

    万次阅读 2022-07-08 13:43:56
    JVM面试题 1.内存模型以及分区,需要详细到每个区放什么 2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点 3. GC 的两种判定方法 4. Minor GC 与 Full GC 分别在什么时候发生? 5. 类加载的几个...
  • JVM面试题

    千次阅读 2020-09-26 15:40:39
    答:JVM内存结构可以大致分为线程私有区域和共享区域,线程私有区域由虚拟机栈、本地方法栈、程序计数器组成,而共享区由堆、元数据空间(方法区)组成。 虚拟机/本地方法栈 StackOverflowException异常出现原因:...
  • 最新Jvm面试题及答案【附答案解析】Jvm面试题及答案2021,Jvm面试题最新面试题Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考...
  • 在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的?  2、不同的虚拟机在实现运行时...
  • 史上最全 Java 面试题JVM 篇 社群交流的面试真题 面试真题1:元空间会产生内存溢出么?在什么情况下会产生内存溢出? 具体问题:元空间会产生内存溢出么?在什么情况下会产生内存溢出?。 java8 及以后的...
  • 在我的上一篇文章别翻了,这篇文章绝对让你...是的,这两个问题就涉及到了JVM 内存结构的知识了,那么这篇文章将进行解答。 @目录1、内存结构还是运行时数据区?2、运行时数据区3、线程共享:Java堆、方法区3.1、Jav...
  • JVM内存结构

    千次阅读 2022-04-29 20:51:42
    JVM简介 ​ JVM(Java Virtual Machine)全称:... 深入理解类加载机制/类的生命周期(面试题) 1. 为什么要深入理解类加载机制 ​ 我们编写Java代码文件都是.java文件,如果只知道: 源文件 -> 编译 -> .class
  • 大家好啊,我是小于哥,Java虚拟无论是在年前面试还是在年后的金三银四面试都是必问的,比如:Java1.8和1.7内存模型有什么差距?堆栈的区别是什么?深拷贝和浅拷贝Java会存在内存泄漏...
  • JVM内存模型 如下图所示: 线程私有: 程序计数器: 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。 1:用于...
  • 最全JVM面试题

    千次阅读 2021-03-29 21:35:50
    而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域,运行时数据区域就是我们常说的JVM内存。 类加载子系统:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法...
  • 在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时...
  • JVM面试题及答案整理(最新版)

    千次阅读 2021-08-05 08:28:41
    Jvm面试题及答案整理965道(2021最新版) 这是我收集的《Jvm 最常见的 965道面试题》高级Java面试问题列表。这些问题主要来自 JVM核心部分 ,你可能知道这些棘手的JVM 问题的答案,或者觉得这些不足以挑战你的 Java ...
  • Java虚拟机(JVM)面试题(2022最新版)

    千次阅读 2022-07-12 08:33:49
    JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、 Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全...
  • 第一部分:面试题 本篇文章我们将尝试回答以下问题: 描述一下jvm内存结构 描述一下jvm的内存模型 谈一下你对常量池的理解 什么情况下会发生栈内存溢出?和内存溢出有什么不同? String str = new String(“abc”...
  • Jvm面试题及答案(Jvm面试题大全带答案)发现网上很多Jvm面试题及答案整理都没有答案,所以花了很长时间搜集,本套Jvm面试题大全,有大量经典的Jvm面试题以及答案,包含Jvm语言常见面试题、面试经验技巧等,应届生,...
  • 本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb (【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识)如果...写在前面 (常见面试题) 基本问题 介绍下 Java 内存区域(运...
  • Jvm面试题及答案(Jvm面试题大全带答案)发现网上很多Jvm面试题及答案整理都没有答案,所以花了很长时间搜集,本套Jvm面试题大全,有大量经典的Jvm面试题以及答案,包含Jvm语言常见面试题、面试经验技巧等,应届生,...
  • 文章目录1、Java中会存在内存泄漏吗,请简单描述。2、64位JVM中,int的长度是多数?3、Serial与Parallel GC之间的不同之处?...8、32位JVM和64位JVM的最大堆内存分别是多数?9、JRE、JDK、JVM及JIT之间
  • 下面整理了10道JVM面试题,是在java面试中考察几率最大的题目,一起来学习吧。 1.什么情况下会发生栈内存溢出? 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量...
  • JVMJVM面试题整理(长期更新)

    千次阅读 2019-08-01 18:15:09
    2、说一下JVM内存结构(Java内存结构/Java内存区域)、Java内存模型区别与关系 3、讲讲什么情况下会出现内存溢出,内存泄漏? 4、说说线程栈 5、JVM 年轻代到年老代的晋升过程的判断条件是什么呢? 6、JVM 出现 ...
  • Java面试题及答案(2022版),适用于应届生、有工作经验的程序员,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作! JVM篇 下载链接:全部面试题及答案PDF 1.JVM 的主要组成部分?及其作用? • 类加载器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,893
精华内容 23,557
关键字:

jvm内存结构面试题