Mem Ops教程
Mem Ops是一个开源Java工具包,为需要稳定状态内存消耗的应用程序提供内存分配工具。稳定状态意味着尽可能恒定的内存消耗,以及尽可能少的垃圾回收。 Mem Ops由Nanosai(我是该公司的联合创始人)开发。
Mem Ops提供以下工具集:
- BytesAllocatorAutoDefrag
- 字节分配器手动碎片整理
- 对象池
- 字节数
Mem Ops的动机
Java不允许我们随意分配和释放内存。如果应用程序需要快速分配和释放小块内存,则通过实例化对象或者字节数组来进行操作将对垃圾收集器造成压力。当然,Java的垃圾收集器一直都在变得越来越好,但这可能还不够好。确保内存消耗保持稳定并且确保垃圾回收暂停不会太长的唯一真实方法是自己控制内存分配。
由于Java不允许我们直接控制内存分配和垃圾回收,因此我们将不得不使用其他构造来实现类似的效果。两个这样的构造是字节数组分配器和对象池。 Mem Ops包含这两种构造以及字节数组分配器(两种形式)。
字节分配
高速读写字节序列的系统需要为数据分配字节数组。我们可以分配一个更大的字节数组,然后再从该更大的字节数组中为应用程序需要读取和写入的字节序列分配较小的字节块,而不是使用" new byte [size]"实例化Java字节数组。
Mem Ops包含两个用于字节序列分配的结构,称为"字节数组分配器"。这些是:
- BytesAllocatorAutoDefrag
- 字节分配器手动碎片整理
通过分配更大字节数组的较小部分并自己管理分配和释放,我们将获得以下优势:
- 我们可以确保Java VM为此目的分配了多少字节。
- 我们可以控制释放的字节序列(块)的内存碎片整理(垃圾回收)。
- 我们可以将基础字节数组的大小与正在运行的体系结构的内部内存缓存(L1,L2和L3)的大小对齐。从已经包含在L2或者L3高速缓存中的字节数组中继续分配可以大大加快字节访问的速度。
对象分配
需要快速创建大量对象但又不需要所有这些对象的系统,可以受益于使用对象池,而不是使用Java的new XYZObject()实例化对象。 Mem Ops也包含一个ObjectPool,可用于合并和重用对象。
字节数
字节类表示从共享字节数组分配的字节序列。 "字节"实例设计用于"对象池",因此我们可以从"对象池"获取"字节"实例,分配一个字节序列,使用它,并在以下情况释放字节序列和"字节"实例你完成了。我们可以在Mem Ops Bytes教程中阅读更多内容。
Mem Ops for Java GitHub存储库
Java GitHub存储库的Mem Ops可以在以下位置找到:
https://github.com/nanosai/mem-ops-java
Mem Ops for Java Maven依赖关系
使用Java Mem Ops的最简单方法是通过Maven。这是一个关于Maven依赖项在项目中的外观的示例:
<dependency> <groupId>com.nanosai</groupId> <artifactId>mem-ops</artifactId> <version>0.6.2</version> </dependency>
切记用我们打算使用的版本替换版本号!