写点什么

堆内内存还是堆外内存?

  • 2014-12-28
  • 本文字数:1239 字

    阅读完需:约 4 分钟

一般情况下,Java 中分配的非空对象都是由 Java 虚拟机的垃圾收集器管理的,也称为堆内内存(on-heap memory)。虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收时,垃圾收集器会对所有分配的堆内内存进行完整的扫描,这意味着一个重要的事实——这样一次垃圾收集对 Java 应用造成的影响,跟堆的大小是成正比的。过大的堆会影响 Java 应用的性能。

对于这个问题,一种解决方案就是使用堆外内存(off-heap memory)。堆外内存意味着把内存对象分配在 Java 虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆,以减少垃圾收集对应用的影响。

但是 Java 本身也在不断对堆内内存的实现方式做改进。两者各有什么优缺点? Vanilla Java 博客作者 Peter Lawrey 撰写了一篇文章,在文中他对三种方式:用 new 来分配对象、对象池(object pool)和堆外内存,进行了详细的分析。

用 new 来分配对象内存是最基本的一种方式,Lawery 提到:

在 Java 5.0 之前,分配对象的代价很大,以至于大家都使用内存池。但是从 5.0 开始,对象分配和垃圾回收变得快多了,研发人员发现了性能的提升,纷纷简化他们的代码,不再使用内存池,而直接用 new 来分配对象。从 5.0 开始,只有一些分配代价较大的对象,比如线程、套接字和数据库链接,用内存池才会有明显的性能提升。

对于内存池,Lawery 认为它主要用于两类对象。第一类是生命周期较短,且结构简单的对象,在内存池中重复利用这些对象能增加 CPU 缓存的命中率,从而提高性能。第二种情况是加载含有大量重复对象的大片数据,此时使用内存池能减少垃圾回收的时间。对此,Lawery 还以 StringInterner 为例进行了说明。

最后 Lawery 分析了堆外内存,它和内存池一样,也能缩短垃圾回收时间,但是它适用的对象和内存池完全相反。内存池往往适用于生命期较短的可变对象,而生命期中等或较长的对象,正是堆外内存要解决的。堆外内存有以下特点:

  • 对于大内存有良好的伸缩性
  • 对垃圾回收停顿的改善可以明显感觉到
  • 在进程间可以共享,减少虚拟机间的复制

Lawery 还提到对外内存最重要的还不是它能改进性能,而是它的确定性。

当然堆外内存也有它自己的问题,最大的问题就是你的数据结构变得不那么直观,如果数据结构比较复杂,就要对它进行串行化(serialization),而串行化本身也会影响性能。另一个问题是由于你可以使用更大的内存,你可能开始担心虚拟内存(即硬盘)的速度对你的影响了。

Lawery 还介绍了 OpenHFT 公司提供三个开源库: Chronicle Queue Chronicle Map Thread Affinity ,这些库可以帮助开发人员使用堆外内存来保存数据。采用堆外内存有很多好处,同时也带来挑战,对堆外内存感兴趣的读者可以阅读 Lawery 的原文来了解更多信息。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-12-28 07:229745
用户头像

发布了 77 篇内容, 共 40.4 次阅读, 收获喜欢 26 次。

关注

评论

发布
暂无评论
发现更多内容

Hack VC:模块化是个错误吗?以数据为依据审视以太坊的这一战略

TechubNews

深入Linux性能与统计命令:优化、监控与管理的首选工具

测试人

软件测试

【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键

云起无垠

10月回顾 | Apache SeaTunnel社区动态与进展一览

白鲸开源

大数据 开源 数据同步 数据集成 Apache SeaTunnel

10月回顾 | Apache DolphinScheduler社区动态与进展一览

白鲸开源

大数据 开源 Apache DolphinScheduler 工作流任务调度

Linux 数据处理三剑客:提升工作效率的必备工具

测试人

软件测试

SQL 审核在 CloudQuery 的四大场景应用

BinTools图尔兹

我手搓了个“自动生成标书”的开源大模型工具

白鲸开源

人工智能 机器学习 GAN 大模型

架构图怎么制作?盘点10个优秀的架构图模板!

职场工具箱

职场 在线白板 架构图 绘图软件 组织架构图

SaaS,PaaS,IaaS是什么意思?一文教你弄懂!

积木链小链

IaaS PaaS SaaS 平台

虚拟化技术:新能源汽车空调控制系统的智能新突破

DevOps和数字孪生

汽车

下周二!白鲸开源WhaleStudio将亮相AWS数据合作伙伴荟萃周,探讨DataOps新质生产力

白鲸开源

AWS DataOps 数据集成 数据调度 白鲸开源

云行| 金陵古都焕发数智活力,天翼云为南京创新发展注入新动能!

天翼云开发者社区

云计算 云服务 天翼云

大模型应用开发初探 : 通用函数调用Planner

不在线第一只蜗牛

大模型

第一!中国专属云服务市场,荣誉+1!

天翼云开发者社区

云计算 云服务 天翼云

天润融通:饮品连锁店,一定要避开的坑!

天润融通

这个 AI 懂 Vue 吗?

TRAE.ai

程序员 AI 智能 智能云

KubeEdge 新版本5大特性解读:更完备的节点设备能力,全新的Dashboard体验

华为云开发者联盟

开源 容器 云原生 kubeedge

创新实践:基于边缘智能+扣子的智能轮椅 AIoT 解决方案

火山引擎边缘云

物联网, 智能IoT边缘服务 大模型 AI 基础设施 边缘智能

淘宝/天猫商品描述API返回值深度解析与实战应用:以taobao.item_get_desc为例

代码忍者

API 接口 pinduoduo API

企业为什么需要国际专线网络?

Ogcloud

SD-WAN国际专线 国际专线 国际网络专线 国际互联网专线

适合企业的十款文档管理系统厂商分析

易成研发中心

堆内内存还是堆外内存?_语言 & 开发_曹知渊_InfoQ精选文章