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

    你可能感兴趣的文章
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>