当前位置: 首页 > news >正文

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

JVM内存结构

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

  1. 年轻代(New Generation)

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

    • 存放从年轻代中经历多次垃圾回收仍然存活的对象。
  3. 永久代/元数据区(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),便于后续分析故障原因。

http://www.lryc.cn/news/353295.html

相关文章:

  • 不靠后端,前端也能搞定接口!
  • 如何秒杀Promise面试题
  • linux文件权限常用知识点,基于Linux(openEuler、CentOS8)
  • 【前端笔记】记录一个能优化Echarts Geo JSON大小的网站
  • 车与网络之间(V2N)简介
  • .Net Core WebAPI参数的传递方式
  • 10款免费黑科技软件,强烈推荐!
  • DFS:解决二叉树问题
  • 【相机开发问题总结】曝光补偿ExposureCompensation未生效异常分析及解决
  • Flutter 中的 DateRangePickerDialog 小部件:全面指南
  • MCS-51伪指令
  • vue3 vant4实现抖音短视频功能
  • C#结合JS实现HtmlTable动态添加行并保存到数据库
  • Unity Render Streaming 云渲染 外网访问
  • 美易官方:Copilot全面升级!
  • 深入了解FreeRTOS:实时操作系统的核心概念和应用
  • Spring框架学习笔记(五):JdbcTemplate 和 声明式事务
  • 考研计组chap1计算机系统概述
  • 如何使用Python中的生成器
  • C语言 读取 MIDI文件头部
  • C# Winform实现五子棋游戏(代完善)
  • 文档档案管理系统整体建设方案书(实际项目原件word2024)
  • React与Vue的区别?
  • leetcode 2115.从给定原材料中找到所有可以做出的菜
  • Opencompass模型评测教程
  • 什么是安全测试,如何进行安全测试?
  • ros的pcl库中对于自己定义的消息,调用pcl库时总是报错 c++
  • DataFrame—数据汇总6
  • Java入门基础学习笔记41——实体类
  • 【Linux】信号之信号的保存和处理详解