JVM性能调优:内存模型及垃圾收集算法

简介: JVM性能调优:内存模型及垃圾收集算法
JVM内存结构

根据Java虚拟机规范,JVM内存主要划分为以下区域:

  1. 年轻代(New Generation)
  • 包括Eden空间,用于存放新创建的对象。
  • Survivor区由两个相同大小的Survivor1Survivor2组成,用于存放经过初次垃圾回收后仍然存活的对象,通过“ survivor-to-survivor ”的过程提升对象年龄,最终符合条件的对象会被移到年老代。
  1. 年老代(Tenured Generation)


  • 存放从年轻代中经历多次垃圾回收仍然存活的对象。\
  1. 永久代/元数据区(Permanent Generation/Metaspace)


  • 在Java 8及以后版本中,永久代被元数据区取代,用于存储类、方法等元数据信息。可通过 -XX:MetaspaceSize-XX:MaxMetaspaceSize 参数调整其大小。
  • 在早期版本中,永久代大小推荐初始设置为128M,并预留30%的增长空间。
垃圾收集算法

JVM的垃圾回收基于“标记-清除”或其衍生算法,具体包括:


  • Serial算法:单线程回收,适用于单CPU环境,执行时会暂停所有用户线程。
  • Parallel算法(并行回收):多线程并行回收,适用于多CPU环境,回收时暂停用户线程,但多个线程并行工作加速回收过程。
  • Concurrent算法(并发回收):多线程回收,与应用程序并发执行,减少暂停时间,适用于对响应时间敏感的应用。
垃圾回收触发条件
  • 年轻代空间(特别是Eden区)填满时,触发Minor GC,只清理年轻代。
  • 年老代元数据区满时,触发Full GC,同时回收年轻代和年老代(或进行元数据区的清理)。
OutOfMemoryError异常

JVM在以下情况可能抛出OutOfMemoryError异常:

  • 年轻代、年老代或元数据区空间耗尽,且无法通过回收获得足够的空间。
  • 即使JVM并未完全耗尽内存,但在连续几次GC后,回收的内存比例小于2%,且JVM花费超过98%的时间在GC上,表明内存已极度碎片化,无法有效利用。


此机制设计旨在允许程序在崩溃前有机会执行最后的操作,例如输出堆转储(Heap Dump),便于后续分析故障原因。

相关文章
|
5天前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
26 10
|
5天前
|
存储 运维 Java
Java面试题:JVM的内存结构有哪些主要部分?请简述每个部分的作用
Java面试题:JVM的内存结构有哪些主要部分?请简述每个部分的作用
26 9
|
5天前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
25 3
|
5天前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
14 2
|
5天前
|
缓存 监控 算法
Java面试题:讨论JVM性能调优的常见方法和技巧。
Java面试题:讨论JVM性能调优的常见方法和技巧。
10 1
|
3天前
|
存储 算法 Java
JAVA内存模型与JVM内存模型的区别
JAVA内存模型与JVM内存模型的区别
|
5天前
|
存储 缓存 安全
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
10 0
|
5天前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
15 0
|
5天前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
15 0
|
5天前
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
9 0