博客
关于我
JVM垃圾回收机制总结(8) :反思和参考资料
阅读量:475 次
发布时间:2019-03-06

本文共 1674 字,大约阅读时间需要 5 分钟。

垃圾回收的悖论:Java垃圾回收的挑战与优化方案

垃圾回收是Java开发中一个长期关注的课题。尽管Java的垃圾回收机制为开发者提供了极大的便利,但在高性能、高并发场景下,它也成为了性能瓶颈的主要原因。JDK的垃圾回收算法一直无法完全解决内存耗尽带来的暂停问题,这直接影响了程序的响应时间,导致资源阻塞和性能下降。这也是JDK引入G1垃圾回收算法的重要背景。

系统设计的关键问题

在技术的基础上,我们需要从系统设计的角度重新审视内存管理问题:

  • 内存分配的合理性:我们是否必须为应用分配如此大的内存空间?
  • 内存使用的优化:是否可以通过更高效的内存管理方式来减少内存占用,而不是仅仅依靠内存扩大?
  • 内存中的内容

    内存中的存储内容主要包括以下几类:

  • 业务相关数据:如Web应用中的Session、即时消息的会话等,这些数据在用户访问周期或使用过程中通常需要持久化存储。
  • 缓存:缓存是优化应用性能的重要手段,快速访问的数据应存储在缓存中。
  • 线程:线程在运行时也会占用内存资源。
  • 如果我们能够将业务数据和缓存从JVM中独立出来,或者通过更智能的内存管理方式减少JVM的内存占用,Java应用所需的内存将会显著减少,从而降低垃圾回收的负担。

    解决之道

  • 数据库与文件系统

    将所有数据存储在数据库或文件系统中是最简单的方式。在这种模式下,Java应用的内存占用仅需处理一次峰值并发请求所需的内存量。数据的获取和处理都可以在每次请求时从数据库或文件系统中动态获取。这种方式虽然效率较低,但内存占用最低,适合对内存敏感的场景。

  • 内存-硬盘映射

    如果避免直接读写文件系统,可以通过模拟硬盘的方式来提升效率。这种方式允许我们在内存中进行读写操作,同时仍然保持内存占用的低水平。Memcached等缓存解决方案正是基于此原理,能够在保持高效的同时减少内存占用。

  • 多JVM部署

    将同一应用划分为多个JVM进程(横拆)或模块(纵拆)进行部署,可以有效控制每个JVM的内存占用和垃圾回收压力。这种方式类似于分布式处理,但需要额外处理进程间通信和资源管理的问题。

  • 程序控制的对象生命周期

    理想的解决方案是让程序本身控制对象的生命周期。这种方式可以通过编程手段标识哪些对象可以在特定时间后直接回收,减少垃圾回收的标记和处理时间。这种方式类似于C/C++的内存管理,但如果JVM能够实现,将是垃圾回收的重大进步。

  • 线程分配

    Java的传统阻塞式线程模型在高并发场景下效率较低。随着NIO技术的普及,开发者逐渐转向非阻塞式线程模型,通过减少线程数量降低资源消耗。未来可能会有更先进的异步I/O(AIO)技术进一步提升性能。

  • 参考资料

    • 《Java 理论与实践: 垃圾收集简史》
    • 《Java SE 6 HotSpotTM Virtual Machine Garbage Collection Tuning》
    • 《Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1》
    • 《Hotspot memory management whitepaper》
    • 《Java Tuning White Paper》
    • 《Diagnosing a Garbage Collection problem》
    • 《Java HotSpot VM Options》
    • 《A Collection of JVM Options》
    • 《Garbage-First Garbage Collection》
    • 《Frequently Asked Questions about Garbage Collection in the HotspotTM JavaTM Virtual Machine》
    • 《JProfiler试用手记》
    • 《Java6 JVM参数选项大全》
    • 《深入Java虚拟机》

    以上内容仅供参考,具体实施前请结合实际场景进行调整。

    转载地址:http://pnmbz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
    查看>>
    Openlayers实战:非4326,3857的投影
    查看>>
    Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>