博客
关于我
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/

    你可能感兴趣的文章
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    oobbs开发手记
    查看>>
    OPEN CASCADE Curve Continuity
    查看>>
    Open Graph Protocol(开放内容协议)
    查看>>
    Open vSwitch实验常用命令
    查看>>
    Open WebUI 忘了登入密码怎么办?
    查看>>
    open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
    查看>>
    open3d-Dll缺失,未找到指定模块解决
    查看>>
    Openbox-桌面图标设置
    查看>>
    opencart出现no such file or dictionary
    查看>>
    opencv Mat push_back
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>