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

Java学习--JVM(2)

        JVM提供垃圾回收机制,其也是JVM的核心机制,其主要是实现自动回收不再被引用的对象所占用的内存;对内存进行整理,防止内存碎片化;以及对内存分配配进行管理。

        JVM 通过两种主要算法判断对象是否可回收:

                引用计数算法:为每个对象维护一个引用计数器,每被一个对象调用,则计数加1,当计数为 0 时,也就是没有被对象调用的时候,即表示该对象可被回收。然而,这个算法无法解决循环引用问题,即a调用b,b调用a的情况,因此已被主流 JVM 弃用。

                可达性分析算法:从 GCRoots 开始,通过引用链判断对象是否可达。不可达的对象被视为垃圾。GC Roots 包括虚拟机栈中的局部变量、类的静态字段、本地方法栈中的 JNI 引用等,企业是目前主流JVM所使用的算法。

        

JVM的垃圾回收机制根据内存区域的不同采用不同的回收策略:

        堆内存回收:主要针对新生代和老年代采用分代收集算法。新生代使用复制算法,将内存分为Eden区和两个Survivor区,对象首先在Eden区分配,经历Minor GC后存活对象被复制到Survivor区。老年代采用标记-清除或标记-整理算法处理长期存活的对象。

        方法区回收:主要回收废弃的常量和不再使用的类。由于回收条件苛刻且收益较低,通常不频繁执行。需要满足类的所有实例已被回收、类加载器已被回收、类的Class对象没有被引用三个条件才会被回收。

        JVM提供多种垃圾收集器以适应不同场景:

                串行收集器:单线程执行垃圾回收,适用于客户端模式和小内存应用,回收时会产生停顿。

                并行收集器:多线程并行回收,适合吞吐量优先的应用场景,能有效利用多核CPU资源。

                并发标记清除收集器:在应用线程运行同时进行大部分回收工作,显著减少停顿时间,适合响应时间敏感的应用。

        JVM还提供内存分配和调优相关机制:

                对象优先在Eden区分配,大对象直接进入老年代,长期存活的对象通过年龄阈值晋升到老年代。

                通过调节新生代与老年代比例、设置停顿时间目标、调整垃圾回收线程数等参数可优化GC性能。

                使用内存逃逸分析和栈上分配等技术减少堆内存压力,某些情况下对象可直接在栈上分配和回收。

        

http://www.xdnf.cn/news/1137061.html

相关文章:

  • 学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
  • 【Linux手册】缓冲区:深入浅出,从核心概念到实现逻辑
  • 数据结构:集合操作(Set Operations): 并集(Union)、交集(Intersection)、 差集(Difference)
  • 【37】MFC入门到精通——MFC中 CString 数字字符串 转 WORD ( CString, WORD/int 互转)
  • 编译原理第六到七章(知识点学习/期末复习/笔试/面试)
  • 【真·CPU训模型!】单颗i7家用本,4天0成本跑通中文小模型训练!Xiaothink-T6-mini-Preview 技术预览版开源发布!
  • 数据投毒技术之标签翻转
  • 题解:CF1829H Don‘t Blame Me
  • React Native 基础tabBar和自定义tabBar - bottom-tabs
  • 【开源软件推荐】 SmartSub,一个可以快速识别视频/音频字幕的工具
  • JavaScript进阶篇——第八章 原型链、深浅拷贝与原型继承全解析
  • 性能优化实践:Modbus 在高并发场景下的吞吐量提升(二)
  • 【Linux】第一个小程序—进度条
  • 自动化技术在造纸行业的应用:EtherCAT转PROFIBUS DP解决方案
  • 【中等】题解力扣22:括号生成
  • MyUI1.0全新现代化 Vue.js 组件库框架上线
  • HCIE - 云计算拿下后的职业选择如何规划?
  • 摩尔投票法:高效寻找数组中的多数元素
  • 基于在线地图的路径规划测评对比-综合对比城区、农村及城乡结合处的导航
  • 阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁
  • DolphinScheduler 如何高效调度 AnalyticDB on Spark 作业?
  • Flutter在Android studio运行出现Error: Entrypoint is not a Dart file
  • SpringBoot 使用MyBatisPlus
  • web APIs(更新中)
  • 【机器学习实战【七】】机器学习特征选定与评估
  • 聚类算法原理与应用(一):K-means聚类算法原理
  • 基础算法题
  • 如何轻松玩转多线程高并发?
  • Install Docker Engine on UbuntuMySQL
  • cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题