JVM面试题集合(二)

简介: JVM面试题集合(二)

如何减少full gc的数量


可以采用以下措施来减少Full GC的次数:

  1. 增加方法区的空间;
  2. 增加老年代的空间;
  3. 减少新生代的空间;
  4. 禁止使用System.gc()方法;
  5. 使用标记-整理算法,尽量保持较大的连续内存空间;
  6. 排查代码中无用的大对象。


对象如何晋升到老年代?


虚拟机给每个对象定义了一个对象年龄(Age)计数器,存储在对象头中。对象通常在Eden区里诞生,如果经过第一次MinorGC后仍然存活,并且能被Survivor容纳的话,该对象会被移动到Survivor空间中,并且将其对象年龄设为1岁。对象在Survivor区中每熬过一次MinorGC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15),就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold设置。


为什么要设置两个Survivor区域?


设置两个 Survivor 区最大的好处就是解决内存碎片化

因为 Survivor 有 2 个区域,所以每次 Minor GC,会将之前 Eden 区和 From 区中的存活对象复制到 To 区域。第二次 Minor GC 时,From 与 To 职责兑换,这时候会将 Eden 区和 To 区中的存活对象再复制到 From 区域,以此反复。

这种机制最大的好处就是,整个过程中,永远有一个 Survivor space 是空的,另一个非空的 Survivor space 是无碎片的


内存泄漏和内存溢出有什么区别?


内存泄漏(memory leak):内存泄漏指程序运行过程中分配内存给临时变量,用完之后却没有被GC回收,始终占用着内存,既不能被使用也不能分配给其他程序,于是就发生了内存泄漏。

内存溢出(out of memory):简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。


内存泄漏和内存溢出的解决方案


  1. 内存泄漏的解决方案:
  • 手动释放内存资源:确保程序中所有动态分配的内存都被正确释放。当内存不再需要时,可以通过手动释放内存资源来避免内存泄漏问题。
  • 垃圾回收:采用自动内存管理机制,如垃圾回收器来回收不再使用的内存资源。
  • 使用内存分析工具:使用内存分析工具来识别内存泄漏的根本原因。内存分析工具可以帮助开发者找到内存泄漏的位置并解决问题。

避免内存泄漏的几点建议:

  1. 尽早释放无用对象的引用。
  2. 避免在循环中创建对象。
  3. 使用字符串处理时避免使用String,应使用StringBuffer。
  4. 尽量少使用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。

   2.内存溢出的解决方案:

  • 调整 JVM 参数:通过调整 JVM 参数来增加系统内存容量。例如,通过设置-Xmx参数来增加Java虚拟机可用内存的上限。
  • 优化代码:编写高效的代码,避免在程序运行时占用大量内存资源。
  • 增加系统内存:增加系统内存容量,以便程序可以申请更多的内存资源。
  • 使用内存分析工具来分析应用程序的内存使用情况,找到程序中存在的内存泄漏和内存浪费问题。
  • 查看错误日志,看有没有“OutOfMemory”错误


哪些区域会OOM,怎么触发OOM


  1. 堆(Heap):堆是Java虚拟机管理的主要内存区域,用于存储所有的对象实例和数组。如果程序申请的堆内存超出了JVM可用的堆内存大小,就会导致OOM错误。
  2. 虚拟机栈(Stack):栈用于存储线程执行时的方法调用和局部变量等信息,栈的大小通常是固定的。如果栈空间被占满,就会导致栈溢出错误。
  3. 方法区(Method Area):方法区用于存储类的元数据信息、静态变量和常量池等数据。如果方法区空间被占满,就会导致OOM错误。
  4. 本地方法栈(Native Stack):本地方法栈用于存储本地方法的信息,与Java虚拟机实现相关。如果本地方法栈空间被占满,就会导致栈溢出错误
  5. 本地直接内存溢出:直接内存(Direct Memory)的容量大小可通过-XX:MaxDirectMemorySize参数来指定,如果不去指定,则默认与Java堆最大值(由-Xmx指定)一致。如果直接通过反射获取Unsafe实例进行内存分配,并超出了上述的限制时,将会引发OOM异常
目录
相关文章
|
3月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
3月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
10天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
10天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
1月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
2月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
下一篇
无影云桌面