JVM简介及面试题集锦二

文章介绍了JVM调优的关键参数,如堆内存、新生代、方法区的大小设定,以及CMS和G1垃圾回收器的调优选项。强调了根据应用场景选择合适参数的重要性,同时提到了内存分区、垃圾回收机制和如何排查解决OOM错误。
摘要由CSDN通过智能技术生成

JVM调优常见参数

JVM调优是优化JVM性能的过程,其中常见的JVM调优参数包括:

  1. -Xmx:指定JVM堆内存最大值。默认值是物理内存的1/4,可以根据实际情况进行调整。

  2. -Xms:指定JVM堆内存初始值。默认值是物理内存的1/64,可以根据实际情况进行调整。

  3. -Xmn:指定JVM堆内存中新生代的大小。默认值是JVM堆内存的1/3。

  4. -XX:PermSize:指定方法区初始大小。默认值是物理内存的1/64。

  5. -XX:MaxPermSize:指定方法区最大大小。默认值是物理内存的1/4。

  6. -XX:NewSize:指定新生代初始大小。默认值是JVM堆内存的1/3。

  7. -XX:MaxNewSize:指定新生代最大大小。默认值是JVM堆内存的1/3。

  8. -XX:SurvivorRatio:指定新生代中eden区与survivor区的比例。默认值是8。

  9. -XX:MaxTenuringThreshold:指定对象晋升到老年代的最大年龄。默认值是15。

  10. -XX:ParallelGCThreads:指定并行垃圾回收线程数。默认值是CPU核数。

这些参数可以通过在JVM启动时通过命令行进行指定,也可以通过修改JVM配置文件进行设置。根据不同的应用场景和实际情况,选择合适的参数进行调优可以有效提升JVM的性能和稳定性。

除了常见的JVM调优参数,还有一些专门针对特定垃圾回收器的参数可以进行调优,例如CMS垃圾回收器,常用的调优参数包括:

  1. -XX:+UseConcMarkSweepGC:使用CMS垃圾回收器。

  2. -XX:CMSInitiatingOccupancyFraction:设置触发CMS垃圾回收的堆内存占用比例阈值。默认值是68%,可以根据实际情况进行调整。

  3. -XX:+UseCMSInitiatingOccupancyOnly:仅在达到CMSInitiatingOccupancyFraction设置的阈值时才触发CMS垃圾回收。

  4. -XX:+CMSParallelRemarkEnabled:开启CMS垃圾回收的并行重标记阶段,提高性能。

  5. -XX:CMSFullGCsBeforeCompaction:在进行一次完整的CMS垃圾回收之前,进行多少次不带压缩的CMS回收。默认值是0,表示每次都带压缩。

  6. -XX:+UseCMSCompactAtFullCollection:在进行一次完整的CMS垃圾回收时,同时进行压缩操作。

还有其他垃圾回收器也有一些专门的调优参数,例如G1垃圾回收器,常用的调优参数包括:

  1. -XX:+UseG1GC:使用G1垃圾回收器。

  2. -XX:G1HeapRegionSize:设置G1中的区域大小。默认值是1MB。

  3. -XX:MaxGCPauseMillis:设置G1回收器的最大停顿时间。默认值是200毫秒。

  4. -XX:G1NewSizePercent:设置G1新生代的最小大小。默认值是5%。

  5. -XX:G1MaxNewSizePercent:设置G1新生代的最大大小。默认值是60%。

  6. -XX:G1ReservePercent:设置G1堆内存保留比例。默认值是10%。

总之,进行JVM调优需要根据具体情况选择合适的调优参数,通过调整参数来优化JVM性能和稳定性。但是需要注意的是,过度调优也可能会导致其他问题,因此需要谨慎选择和调整参数。

面试题及答案

        1.JVM内存分为哪些区域?

JVM内存分为程序计数器、虚拟机栈、本地方法栈、堆和方法区五个区域。

程序计数器是一块较小的内存区域,它保存当前线程执行的字节码指令地址。

虚拟机栈用于保存方法执行时的局部变量、操作数栈、动态链接、方法出口等信息。

本地方法栈与虚拟机栈类似,只不过是为本地方法服务的。

堆是JVM管理的最大的一块内存区域,用于存储Java对象实例。

方法区用于存储类和方法等元数据信息。

        2.什么是垃圾回收?有哪些垃圾回收器?

垃圾回收是指JVM自动回收不再使用的内存空间,以便将这些空间重新分配给新的对象使用。JVM使用垃圾回收来自动管理内存,避免了手动管理内存的复杂性和错误。

    垃圾回收器是负责执行垃圾回收的程序组件,它们通常使用算法来判断哪些对象是“垃圾”,然后将其回收。JVM提供了多种垃圾回收器,如串行垃圾回收器、并行垃圾回收器、CMS垃圾回收器、G1垃圾回收器等,每种垃圾回收器都有不同的特点和适用场景。

        5.什么是双亲委派模型?

双亲委派模型是一种JVM类加载机制,它要求所有的类加载请求都由父类加载器先处理,只有在父类加载器无法处理时,才由子类加载器来处理。这样做的好处是可以避免类的重复加载,并且保证类的加载是从最上层的父类加载器开始,确保类的唯一性和安全性。

        6.OOM产生的原因?

        Java中的OOM(Out Of Memory)错误通常是由于Java虚拟机(JVM)无法为应用程序分配足够的内存而导致的。这种错误通常发生在应用程序需要的内存超过了JVM分配给它的内存限制时。以下是一些可能导致OOM错误的原因以及排查方式:

                6.1内存泄漏:内存泄漏是指应用程序在使用内存时没有释放已经不再使用的对象或数据结构,这些对象或数据结构在内存中继续占用空间,导致内存耗尽。排查内存泄漏的方式通常是使用Java Profiler来监控应用程序的内存使用情况,以找出哪些对象或数据结构占用了大量内存而没有被正确释放。

                6.2过度的对象创建:在Java中创建对象需要分配内存,如果应用程序创建了大量的对象,可能会导致内存不足。优化对象创建的方式包括使用对象池、重用对象等。

                6.3过度的递归:递归是一种常见的编程技术,但是如果递归的层数过深,可能会导致堆栈溢出(StackOverflowError)或OOM错误。优化递归的方式包括优化递归算法、使用循环代替递归等。

                6.4内存设置不合理:JVM的内存设置对应用程序的内存使用有很大的影响,如果设置不合理可能会导致OOM错误。优化内存设置的方式包括调整JVM的启动参数、增加JVM的内存限制等。

                6.5外部资源未关闭:在Java中,打开文件、数据库连接、网络连接等操作都会占用系统资源,如果这些资源没有正确关闭,可能会导致OOM错误。优化外部资源的关闭方式包括使用try-with-resources语句块、手动关闭资源等。

        7.排查OOM错误的方式?

                7.1分析OOM错误日志:当JVM发生OOM错误时,会在日志中记录错误信息,分析错误信息可以找到造成OOM错误的原因。

                7.2使用Java Profiler:Java Profiler可以监控应用程序的内存使用情况、线程使用情况等,通过分析Profiler的输出可以找到造成OOM错误的原因。

                7.3增加JVM的内存限制:如果应用程序需要更多的内存,可以通过增加JVM的内存限制来解决OOM错误,但是需要注意内存设置不合理也可能会导致其他问题。

                7.4优化应用程序的代码:优化应用程序的代码,包括优化对象创建、减少内存泄漏、优化递归算法等,可以减少应用程序的内存使用,避免OOM错误的发生.

                7.5使用分布式缓存:如果应用程序需要缓存大量的数据,可以使用分布式缓存来减少应用程序的内存使用。分布式缓存可以将缓存数据存储在多个节点上,减少单个节点的内存使用。

                7.6减少数据量:如果应用程序需要处理大量的数据,可以考虑减少数据量,比如对数据进行分页、对数据进行过滤等。

                7.7压缩数据:如果应用程序需要存储大量的数据,可以考虑压缩数据。压缩数据可以减少数据的存储空间,从而减少应用程序的内存使用。

        8.G1和CMS垃圾回收有什么区别?

        G1(Garbage-First)和CMS(Concurrent Mark-Sweep)都是Java虚拟机的垃圾回收器,它们有以下的区别:

                8.1垃圾回收算法:G1使用的是分代垃圾回收算法,同时还有大量的优化,如Region化的内存分配等。CMS使用的是标记-清除算法。

                8.2回收机制:G1使用的是基于Region的内存回收机制,将堆内存分割成大小相等的区域,分别进行垃圾回收。CMS采用的是并发标记清除算法,可以在回收垃圾的同时,不阻塞应用程序的运行。

                8.3回收时间:G1是一种可预测的垃圾回收器,可以控制垃圾回收的时间和频率,避免了垃圾回收造成的长时间停顿。而CMS回收器是一种并发的垃圾回收器,可以在应用程序运行的同时进行垃圾回收,但是当垃圾回收无法跟上对象的创建速度时,可能会导致Full GC,造成长时间停顿。

                8.4内存使用效率:G1将堆内存分割成大小相等的区域,可以有效地避免内存碎片化,提高了内存使用效率。而CMS由于使用标记-清除算法,可能会导致内存碎片化,进而降低内存使用效率。

                8.5并发度:G1通过并行回收、并发标记等技术,可以在保证垃圾回收效率的同时,保证应用程序的响应性能。而CMS是一种完全并发的垃圾回收器,可以在垃圾回收的同时不影响应用程序的运行。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值