草庐IT

【面试大全-JVM】必备JVM

rundreamsFly 2024-03-26 原文

知识汇总

  • 需要了解 内存模型 各部分作用,保存哪些数据
  • 类加载双亲委派加载机制,常用加载器加载哪些类型的类
  • GC分代回收的思想、不同垃圾回收算法的思路
  • 性能调优及常有的参数作用,参数调优的依据和工具分析问题的使用方法。
  • 执行模式
  • 编译器优化

Java内存模型

  • (线程独占):又称为方法栈,线程私有的,与线程同一时间创建,线程执行方法都会创建一个栈阵,用来存储局部变量表,调用方法时执行入栈,方法返回时执行出栈。,-Xss参数可以设置虚拟机栈大小。
  • 本地方法栈:与栈类似,也是用来保存执行方法的信息,执行Java方法是使用栈,实现Native方法是使用本地方法栈 C语言
  • 程序计算器:保存当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为Java方法服务,Native方法时程序计算器为空。
  • :JVM内存中管理最大的一块,对线程共享,目的是存放对象的实例,几乎所遇见的对象实例都会放在这里,当堆没有空间时,会抛出OOM异常,根据对象的存活周期不一样,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理。
  • 方法区(非堆区):线程共享的,用于存储已被虚拟机加载的类信息,常量,静态变量等。

说说类加载与卸载

  • 加载通过类的完全限定名,查找次类字节码文件,利用字节码文件创建Class对象
  • 验证当前Class文件符合当前虚拟机的要求,不会危害到虚拟机自身安全
  • 准备进行内存分配
  • 解析 将常量池中的符号引用替换
  • 初始化主要完成静态块执行及静态变量的赋值。
  • 加载机制:双亲委派模式,即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器,父类加载器能够完成加载者成功返回,不能再进行子类加载。
  • 优点:避免类的重复加载、避免Java核心API被篡改
  • 分代回收:年轻代 、标记复制老年代、标记清除

JVM垃圾回收算法

  • G1算法
  • 1.9后默认的垃圾回收算法,特点是保持高回收率并减少停顿,采用每次只清理一部分,而不是清理全部的增量式清理,以保证停顿时间不会过长。
  • 其取消了新生代和老年代的物理划分,但任然属于分代收集器。
  • 同CMS相同,会遍历所有对象,标记引用情况,清楚对象后对区域进行复制移动,以整合碎片空间
  • ZBC算法

说说堆和栈的区别

  • 栈是运行时单位,代表着逻辑,内含基本数据类型和堆中的引用,所在区域连续,没有碎片。
  • 堆是存储单位,代表着数据,可被多个栈共享,所在区域不联系,碎片化。
  • 功能不同:栈用来存储局部变量和方法调用,而堆内存来存储Java中的对象,无论是成员变量、局部变量、还是类变量,它们指向的对象都是存储在堆内存中。
  • 共享性不一样:栈是线程私有的,堆是内存中共享的。
  • 异常错误不同:栈内存不足:StackOverFlowError、堆内存不住:OutOfMemoryError
  • 空间大小:栈的空间远远小于堆空间的大小

什么时候会发生FullGC

  • 直接调用 System.gc() 方法
  • 旧生代空间不足:新生代对象转入或创建大对象,当执行FullGC仍然内存不足时,抛出java.lang.OutOfMemoryError: Java heap space 错误
  • 永久代空间满时:当系统要加载的类、反射的类、和调用方法比较多时,永久代可能会被占满,如果还是不足则抛出: java.lang.OutOfMemoryError: PermGen space

什么是虚拟机,为什么Java叫与平台无关的语言

  • Java虚拟机是可以执行Java字节码的虚拟机进程,Java源文件被编译成Java虚拟机执行的字节码文件,Java编译后可实现跨平台,因为JVM虚拟机让这个变得可能。

谈谈对象分配规则

  • 对象有限分配在Eden区,如果没有足够的空间,则进行MinorGC
  • 大对象直接进入老年代,这样做是避免内存中进行拷贝(新生代采用复制算法收集内存)
  • 长期存活的对象进入老年代,

描述下JVM加载class文件原理机制

  • JVM的加载是由类加载器(ClassLoader)和它的子类来实现的,当Java程序需要某个类时,JVM确保这个类已经被加载、验证、准备、解析、初始化等操作,类加载就是把.class文件读取到内存中,通常创建一个字节数组进行存取。
  • 类加载机制采用了双亲委派机制进行加载、保证了平台的安全性。

关于类的生命周期

  • 加载、查找并加载二进制数据、在Java堆中创建一个Class类的对象。
  • 连接(验证、准备、解析)
  • 初始化:类赋值
  • 使用:new出对象
  • 卸载:执行垃圾回收

如何判断对象可以被回收

  • 引用计数:每个对象都有一个引用计算属性、新增一个引用+1,引用释放-1,计数为0时可以回收,次方法简单,无法解决对象互相引用问题。
  • 可达性分析:从GC Roots开始向下搜索,搜索所经过的路径称为引用链,当一个对象从GC Roots没有任何引用链时,则证明次对象是不可用的,可进行回收。

垃圾回收算法

  • 标记-清除算法:算法分别是标记和清除两个阶段、首先标记出所需要清理的对象,在标记完成后统一对标记的对象进行回收。
  • 复制算法:讲可用的容量划分为相等的两块,每次只使用其中的一块,当一块内存要用完了的时候,就将存活的对象复制到另一块上面,然后把已经使用过的一块全部清楚。
  • 标记-压缩算法:标记和标记-清除算法中一致,让所有存活的内存都移向一边,然后清理掉端边界以外的内存。
  • 分代收集算法:把堆内存分为新生代和老年代,这样可以根据不同年代的特点采用最适合的垃圾收集算法。

调优的命令有哪些

  • jps:显示指定系统内所有HotSpot虚拟机进程
  • jstat:用于监视虚拟机运行时状态命令,显示虚拟机内存,垃圾回收等。
  • jmap:生成 heap dump文件
  • jstack:生成当时的线程快照
  • jinfo:实时查看和调整虚拟机的运行参数

常见的调优工具

  • jconsole:jdk自带的监控控制台
  • Java VisualVM:内存快照、线程快照。
  • arthas 阿里巴巴开源 命令查看

为什么将-Xms和-Xmx设置为相同的值

  • 每次JVM增加堆大小时,它都必须向操作系统申请额外的内存,这会有一定的时间开销。
  • 使用较小的堆大小,使得GC更加的频繁,如果从最开始就设置大一些,GC就不会那也频繁。

逃逸分析

虚拟机为什么要使用元空间替换永久代

  • 在之前方法区都是永久代来实现的
  • 从1.8开始,取消了永久代,改为元空间,换句话说方法区还在,只是实现变了,从永久代变成了元空间。
  • 在jdk1.8后,方法区存于元空间,物理内存不在于堆连续,而是直接存于本地内存中,理论上是(内存有多大、元空间就有多大)
  • 之所以要替换永久代:是为了避免OOM异常,因为设置了永久代的大小,当使用元空间时,可以加载多少类的元数据不再由MaxPermSize来控制,而由系统实际空间来控制。

调优命令有哪些

  • 堆栈内存相关
  • -Xms 设置初始堆的大小
  • -Xmx 设置最大堆的大小
  • -Xss 每个线程的堆栈大小
  • 垃圾收集器相关
  • -XX:+UseParallelGC:选择垃圾收集器为并行收集器。
  • -XX:ParallelGCThreads=20:配置并行收集器的线程数
  • -XX:+UseCMSCompactAtFullCollection 。可能会影响性能,但是
    可以消除碎片
  • 辅助信息
  • -XX:+PrintGCDetails 打印GC详细信息
  • -XX:+HeapDumpOnOutOfMemoryError让JVM在发生内存溢出的时候自动生成内存快照,排查问题用
  • -XX:+DisableExplicitGC禁止系统System.gc(),防止手动误触发FGC造成问题

JVM有哪些垃圾回收器

  • Serial收集器(复制算法):新生代单线程收集器,有点是简单高效
  • ParNew收集器(复制算法):新生代并行收集器,实际是Serial多线程收集器。
  • Parallel Scavenge(复制算法):新生代并行收集器,高吞吐,高效利用CPU。
  • Serial Old收集器(标记-整理):老年代单线程收集器。
  • Parallel Old收集器(标记-整理):老年代并行收集器
  • CMS(标记-清除):搞并发,低停顿。
  • G1(标记-整理):Java堆并行收集器,不会产生内存碎片。
  • ZGC:不设年龄分代,使用了读屏障,在JDK11中加入。
  • 新生代垃圾收集器:Serial、ParNew、Paral
  • 老年代垃圾收集器:CMS、Serial Old、Parallel Old
  • 整堆收集器:G1、ZGC

如何选择垃圾收集器

  • 如果堆不是特别大、且单核的机器、选择单线程收集器(参数: -XX:+UseSerialGC)
  • 如果吞吐量优先的,并且停顿时间没有要求的,可以选择并行收集器( -XX:+UseParallelGC)
  • 响应要求高、较少的停顿、基本上选择CMS、G1、ZGC(-XX:+UseZGC、-XX:+UseG1GC)
  • 使用并行收集器是一个不错的选择。

有关【面试大全-JVM】必备JVM的更多相关文章

  1. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  2. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  3. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  4. 西安华为OD面试体验 - 2

    西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,

  5. [面试直通版]操作系统核心之进程、线程与协程(下) - 2

    点击->操作系统复习的文章集目录操作系统线程线程是什么进程与线程的关系用户态/内核态操作系统资源管理内核态用户态内核态/用户态切换程序运行类型分析计算密集型IO密集型结合进程,线程来理解程序运行类型分析协程基础上下文切换协程协程为什么叫协作式线程?协程的优缺点操作系统线程典型问题:简述进程和线程的区别以下内容带您一步步了解线程是什么比进程更小的独立运行的基本单位-线程(Threads)线程的提出主要是为了提高系统内程序并发执行的程度,从而进一步提升系统的吞吐量,充分发挥多核CPU的优越性而设计的引入进程是为了操作系统更加方便地管理程序,使得多个程序能并发管理和执行而线程则是为了减少程序在并发执

  6. Linux网络编程必备的POSIX API的细节 - 2

    目录POSIXAPI大集合五元组三次握手的过程,内核协议栈分析listen函数DDOS攻击,洪水攻击DDOS攻击的应对措施数据发送 怎么保证顺序?如何保证包地顺序到达(序号+确认应答机制+重传)TCP断开连接的过程问题1.大量的CLOSE_WAIT+FIN_WAIT2是为啥?time_wait状态存在的原因?POSIXAPI大集合五元组(sip,sport,dip,dport,protocol)三次握手的过程,内核协议栈分析内核协议栈中是有内核数据结构的.  我们send/write数据,都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的对端的接收过程也是经有内核协议栈

  7. 【华为OD技术面试 | 真八股 】MySQL联合索引,谈springIOC的理解,谈springAOP的理解,Erika和zookeeper等问题 - 2

    文章目录华为OD面试流程1.mysql数据库建了两个字段,且设置了联合索引,如果其中有一个字段为空会出现什么问题?2.谈谈springIOC的理解,有什么好处,解决了什么问题3.谈谈springAOP的理解,切面编程有没有实际应用,有哪些注解,作用是什么,有那些应用场景?4.Erika和zookeeper有了解过吗,作用是什么,主要解决了什么问题5.谈谈JDK、JRE、JVM的理解,区别是什么6.谈谈对泛型的理解7.JVM的组成华为OD面试流程机试:三道算法题,关于机试,橡皮擦已经准备好了各语言专栏,可以直接订阅。性格测试:机试技术一面(本专栏核心)技术二面(本专栏核心)主管面试定级定薪发of

  8. 科研中论文常见数学符号及其含义(科研必备,建议收藏) - 2

    论文常见数学符号及其含义(科研必备)返回论文和资料目录数学符号在数学领域是非常重要的。在论文中,使用数学符号可以使得论文更加简洁明了,同时也能够准确地描述各种概念和理论。在本篇博客中,我将介绍一些常见的数学符号及其含义(省去特别简单的符号),希望能够帮助读者更好地理解数学论文。高等数学∑i=1nxi\sum_{i=1}^nx_i∑i=1n​xi​(求和符号):表示将x1,x2,…,xnx_1,x_2,\dots,x_nx1​,x2​,…,xn​中的所有数相加,例如∑i=1nxi\sum_{i=1}^nx_i∑i=1n​xi​表示将x1,x2,…,xnx_1,x_2,\dots,x_nx1​,x

  9. 相机面试问题总结 - 2

    1,Camera基本工作原理答案:光线通过镜头Lens进入摄像头内部,然后经过IRFilter过滤红外光,最后到达sensor(传感器),senor分为按照材质可以分为CMOS和CCD两种,可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式RawData,后面有讲进行加工)加工处理,转换成RGB、YUV等格式输出。数据流是如何从sensor到APP的?上述描述结束后,在ISP处理后面的阶段,数据会进行分流,分为capture,preview,video等以供后续动作使用。例如

  10. ruby-on-rails - 如何在一个周末准备 Ruby 面试 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。我是一名经验丰富的网络开发人员,但只有一点点Ruby/Rails经验。我周一刚在一家Ruby商店接受面试,他们确实意识到我没有太多Ruby经验。除了我手边的2或3本Ruby书籍外,我还可以利用哪些其他资源来参加周末的Ruby速成类。顺便说一下,我在hostingrails上确实有一个最低限度的帐户,尽管我从未使用过它。我没有看到任何其他与搜索“rubyi

随机推荐