AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

堆内内存还是堆外内存?

  • 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:229499
用户头像

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

关注

评论

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

【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)

码界西柚

redis 数据结构 字典 redis 底层原理 数据库 nosql

【每日学点HarmonyOS Next知识】路由返回、滚动到中间、worker取消任务、文本选择多级联动

轻口味

HarmonyOS HarmonyOS NEXT

当低代码遇见麒麟OS:深度兼容统信UOS的图形渲染引擎改造技术揭秘

不在线第一只蜗牛

低代码

游戏代练行业新趋势:代练护航系统小程序的价值与潜力

DUOKE七七

【第 8 期】搜索客 Meetup - Elasticsearch 的一些“双刃剑”特性

极限实验室

Meetup Elastic Search 搜索客社区

【连载 22】性能测试实践——超时结账第二回合

FunTester

《Operating System Concepts》阅读笔记:p309-p330

codists

操作系统

音乐NFT系统的测试

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

SvelteKit 最新中文文档教程(3)—— 数据加载

冴羽

JavaScript 前端开发 前端框架 Svelte SvelteKit

【每日学点HarmonyOS Next知识】tab拦截、组件方法做参数、自定义组件链式调用、多次观察者监听、横竖屏切换

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】路由栈问题、图片圆角、颜色资源转十六进制字符串、数据集变化崩溃、组件声明周期

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】自定义对象传参、页面生命周期、自定义弹窗、路由打开对话框,网络图片

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】页面引用问题、Json三方库、路由表使用、下拉刷新问题、视频播放错误

轻口味

HarmonyOS HarmonyOS NEXT

资产管理系统建设解决方案,项目实施运维方案

金陵老街

资产管理 系统方案

音乐NFT软件系统的开发

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

记录一下 简单udp和sni 代理 done

八苦-瞿昙

C# Proxy

【每日学点HarmonyOS Next知识】抽屉效果、树状组件、离屏渲染、上下文获取、Tab声明周期

轻口味

HarmonyOS HarmonyOS NEXT

故障测试助力系统稳定性

FunTester

全链路赋能游戏鸿蒙化适配,鸿蒙游戏开发者服务焕新升级

最新动态

音乐NFT系统的网络安全

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

【每日学点HarmonyOS Next知识】防截屏、作用域问题、观察器问题、对话框关闭、判断对象包含某个字段

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】点赞动画实现、Grid当前显示条目、刷新组件、代码规范、状态变量

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】上下拉动作、图片预览、组件边距、this获取、svg旋转

轻口味

HarmonyOS HarmonyOS NEXT

【每日学点HarmonyOS Next知识】类型判断、刘海高度、隐私弹窗、滑动下一页效果、清楚缓存

轻口味

HarmonyOS HarmonyOS NEXT

30分钟搞定电商系统核心业务逻辑!AI工具实战演示高效开发秘诀

飞算JavaAI开发助手

五大方向全面对比 IoTDB 与 OpenTSDB

Apache IoTDB

懒猫微服助我生活工作穿梭无忧

玄兴梦影

NAS 远程访问 懒猫微服 微型服务器 私有云助手

音乐NFT系统的协议

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

音乐NFT系统的运维

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

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