美文网首页互联网科技
每天进步一点点:“JVM性能调优解析”,分享JVM进阶面试题77

每天进步一点点:“JVM性能调优解析”,分享JVM进阶面试题77

作者: 风平浪静如码 | 来源:发表于2020-05-12 21:18 被阅读0次

    前言

    Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

    Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

    Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库。

    分享详细解析77道Java面试时常问的JVM题,希望对各位有所帮助,另外我针对当前互联网面试总结一些资料给大家,文末有领取方式(诚意满满)

    由于文章篇幅问题,我这里就不一一解析了,需要获取全部答案解析的可以 点击这里 获取文档!


    1、java中会存在内存泄漏吗,请简单描述。
    2、64 位 JVM 中,int 的长度是多数?
    3、Serial 与 Parallel GC 之间的不同之处?
    4、32 位和 64 位的 JVM,int 类型变量的长度是多数?
    5、Java 中 WeakReference 与 SoftReference 的区别?
    6、JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用

    当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM主要动机在于可以指定最大堆大小,通过压缩OOP 可以节省一定的内存。通过-XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

    7、怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?
    8、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
    9、JRE、JDK、JVM 及 JIT 之间有什么不同?
    10、解释 Java 堆空间及 GC?
    11、JVM 内存区域

    JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。
    线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。

    线程共享区域随虚拟机的启动/关闭而创建/销毁。

    直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用DirectByteBuffer 对象作为这块内存的引用进行操作, 这样就避免了在 Java堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。

    12、程序计数器(线程私有)
    13、虚拟机栈(线程私有)
    14、本地方法区(线程私有)
    15、你能保证 GC 执行吗?
    16、怎么获取 Java 程序使用的内存?堆使用的百分比?

    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,
    Runtime.maxMemory() 返回最大内存的字节数。

    17、Java中堆和栈有什么区别?
    18、描述一下 JVM 加载 class 文件的原理机制
    19、GC 是什么?为什么要有 GC?
    20、堆(Heap-线程共享) -运行时数据区
    21、方法区/永久代(线程共享)
    22、JVM 运行时内存

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

    23、新生代
    24、老年代
    25、永久代
    26、JAVA8 与元数据
    27、引用计数法
    28、可达性分析
    29、标记清除算法( Mark-Sweep)

    最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。如图:

    从图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。

    30、复制算法(copying)
    31、标记整理算法(Mark-Compact)
    32、分代收集算法
    33、新生代与复制算法
    34、老年代与标记复制算法
    35、JAVA 强引用
    36、JAVA 软引用
    37、JAVA 弱引用
    38、JAVA 虚引用

    虚引用需要 PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。 虚引用的主要作用是跟踪对象被垃圾回收的状态。

    39、分代收集算法
    40、在新生代-复制算法
    41、在老年代-标记整理算法
    42、分区收集算法
    43、GC 垃圾收集器
    44、Serial 垃圾收集器(单线程、 复制算法)
    45、ParNew 垃圾收集器(Serial+多线程)
    46、Parallel Scavenge 收集器(多线程复制算法、高效)
    47、Serial Old 收集器(单线程标记整理算法 )

    Serial Old 是 Serial 垃圾收集器年老代版本,它同样是个单线程的收集器,使用标记-整理算法,这个收集器也主要是运行在 Client 默认的 java 虚拟机默认的年老代垃圾收集器。在 Server 模式下,主要有两个用途:

    • 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。
    • 作为年老代中使用 CMS 收集器的后备垃圾收集方案。新生代 Serial 与年老代 Serial Old 搭配垃圾收集过程图:

    新生代 Parallel Scavenge 收集器与 ParNew 收集器工作原理类似,都是多线程的收集器,都使用的是复制算法,在垃圾收集过程中都需要暂停所有的工作线程。新生代 ParallelScavenge/ParNew 与年老代 Serial Old 搭配垃圾收集过程图:

    48、Parallel Old 收集器(多线程标记整理算法)
    49、CMS 收集器(多线程标记清除算法)
    50、G1 收集器
    51、JVM 类加载机制
    52、类加载器
    53、双亲委派
    54、OSGI( 动态模型系统)
    55、动态改变构造
    56、模块化编程与热插拔
    57、JVM内存模型

    线程独占:栈,本地方法栈,程序计数器
    线程共享:堆,方法区

    58、栈

    又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈.

    59、本地方法栈

    与栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈.

    60、程序计数器

    保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空.

    61、堆

    JVM内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会放在这里,当堆没有可用空间时,会抛出OOM异常.根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理

    62、方法区
    63、分代回收
    64、堆和栈的区别
    65、什么时候会触犯FullGC
    66、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
    67、对象分配规则
    68、描述一下JVM加载class文件的原理机制?
    69、Java对象创建过程
    70、简述Java的对象结构
    71、如何判断对象可以被回收

    判断对象是否存活一般有两种方式:

    • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
    • 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    72、JVM的永久代中会发生垃圾回收么
    73、垃圾收集算法
    74、调优命令有哪些?
    75、调优工具
    76、Minor GC与Full GC分别在什么时候发生?
    77、你知道哪些JVM性能调优

    设定堆内存大小
    -Xmx:堆内存最大限制。
    设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代
    -XX:NewSize:新生代大小
    -XX:NewRatio 新生代和老生代占比
    -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
    设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC


    分享一下我的一套学习资料库,大伙看看有没有需要的:

    • Java核心知识点:
    • Java千道面试宝典:

    内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈

    • 架构学习资料:
    • 学习视频:

    以上这些学习资料都能够免费分享给小伙伴们,希望能一起努力,共同进步!有需要的,直接戳 免费领取

    干货分享

    你是否经历过这样的场景:

    运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!

    新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就......想解决线上JVM GC问题,但却无从下手。

    每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC,OOM等问题,一脸懵圈!

    JVM调优,调的是稳定。
    服务稳定的重要性就不用多说了,保证服务的稳定,GC永远会是Java程序员需要考虑的不稳定因素之一。
    复杂和高并发下的服务,必须保证每次GC不会出现性能下降,各种性能指标不会出现波动,GC回收规律而且干净,找到合适的JVM设置。
    详细了解JVM的话请看神书《深入理解java虚拟机》。
    或者直接听诸葛老师(前京东资深架构)的这堂两天两分JVM专题课!直观感受JVM的调优实战

    两天突击训练实战课,你能学到:

    第一天:亿级流量电商系统JVM性能调优实战
    1、深入剖析Java虚拟机内存模型
    2、JVM垃圾收集机制解密
    3、常见JVM诊断工具调优实战
    4、亿级流量电商网站JVM参数调优实战
    5、日均百万级交易系统JVM调优实战
    6、Java虚拟机常见面试题剖析
    7、动手实战优化自己公司线上系统JVM

    第二天: 深入理解JVM多线程设计与JMM内存模型
    1、CPU多核并发缓存架构剖析
    2、Java线程内存模型底层实现原理
    3、CPU缓存一致性协议详解
    4、深入汇编语言底层理解volatile关键字
    5、并发编程的可见性,原子性与有序性详解
    6、动手实战优化线上系统高并发程序

    适合人群:如果你有Java项目开发经验,想深入理解Java虚拟机并在实际工作中解决线上JVM调优的问题,尤其是想在高并发处理方面提升自己的内功,为开发高性能程序打下深入的基础,那这门短期课程的内容就是你要掌握的。

    想参与这场为期两天的短期课程的可以进Q群:909666042 咨询参与,致敬大师,致敬未来的你!

    前京东唯品会架构师带你实战JVM调优,帮你积累亿级流量,千万级QPS,百万级TPS互联网系统线上调优经验,从此开启涨薪升级之旅!
    让你在简历上可以增加JVM调优经验,从此横扫一切关于JVM面试问题,吊打所有敢于提问JVM的面试官,成为一个行走的offer收割机!

    相关文章

      网友评论

        本文标题:每天进步一点点:“JVM性能调优解析”,分享JVM进阶面试题77

        本文链接:https://www.haomeiwen.com/subject/jzeinhtx.html