Java:汇总堆外数据
探索如何以最小的垃圾收集影响和最大的内存利用率创建堆外聚合。
使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销。 这也意味着,一旦聚合超出范围,垃圾收集器将必须清理这些对象。
阅读这篇简短的文章,了解如何使用Speedment Stream ORM创建堆外聚合,这些聚合可以更有效地利用内存,而对GC的影响很小或没有。
人
假设我们有大量具有以下形状的Person
对象:
public class Person {private final int age;private final short height;private final short weight; private final String gender;private final double salary;…// Getters and setters hidden for brievity
}
出于争论的目的,我们还可以访问一个名为persons()
的方法,该方法将使用所有这些Person
对象创建一个新的Stream
。
每年龄工资
我们要为每个年龄段创建平均工资。 为了表示汇总的结果,我们将使用称为AgeSalary
的数据类,该数据类将某个年龄与平均工资相关联。
public class AgeSalary {private int age;private double avgSalary;… // Getters and setters hidden for brievity
}
工资的年龄分组通常需要使用少于100个存储桶,因此此示例仅用于说明原理。 存储桶越多,聚集异常堆的意义就越大。
解
使用Speedment Stream ORM,我们可以通过以下三个步骤得出堆外聚合解决方案:
创建一个聚合器
var aggregator = Aggregator.builderOfType(Person.class, AgeSalary::new).on(Person::age).key(AgeSalary::setAge).on(Person::salary).average(AgeSalary::setAvgSalary).build();
聚合器可以反复使用。
计算聚合
var aggregation = persons().collect(aggregator.createCollector());
使用聚合器,我们创建了一个标准的Java流收集器,其内部状态完全处于堆外。
使用汇总结果
aggregation.streamAndClose().forEach(System.out::println);
由于聚合保存的是堆外存储的数据,因此可以从显式关闭中受益,而不仅仅是在很长时间之后才进行清理。 可以通过调用close()
方法(可能是利用AutoCloseable
特性close()
来完成关闭聚合的操作,或者如上例所示,使用streamAndClose()
返回流,该流将在流终止后关闭Aggregation
。
一站式服务
上面的代码可以简化为一种有效的代码:
persons().collect(Aggregator.builderOfType(Person.class, AgeSalary::new).on(Person::age).key(AgeSalary::setAge).on(Person::salary).average(AgeSalary::setAvgSalary).build().createCollector()
).streamAndClose().forEach(System.out::println);
还支持并行聚合。 只需添加流操作Stream::parallel
并使用ForkJoin
池完成聚合。
资源资源
在此处下载Speedment
在此处阅读有关堆外聚合的更多信息
翻译自: https://www.javacodegeeks.com/2018/12/java-aggregate-data-heap.html
Java:汇总堆外数据相关推荐
- java堆内与堆外数据交互_Java:汇总堆外数据
java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...
- java nio 堆外内存_Java堆外内存之突破JVM枷锁
对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...
- java 查看堆外内存占用_Java堆外内存排查小结
简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解: pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NM ...
- java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了
上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...
- haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了
上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...
- JVM--Java堆外内存--使用/作用
原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的堆外内存.包括:堆外内存介绍.创建/回收方法.为什么堆外内存能够提升IO效率. 堆外内存简 ...
- 日本java69_Java应用监控(10)-NMT堆外内存分析2
1.概述 是否曾经想过为什么Java应用程序通过众所周知的 -Xms和-Xmx 调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JVM可能会分配额外的本机内存.这些额外的分配最终可能 ...
- netty堆外内存的使用
一.java的堆外内存 堆外内存的限额默认与堆内内存(由-XMX 设定)相同,可用 -XX:MaxDirectMemorySize 重新设定 1.优缺点 优点: (1)可以扩展至更大的内存空间.比如超 ...
最新文章
- 才知道创建数据表的后面int(M)的m居然和存储大小没有关系
- 机器学习常用激活函数
- access database in a helper function ?
- python自动化办公pdf-基于python实现自动化办公学习笔记
- 解决eclipse中java项目导出成jar包后读写UTF-8文件中文乱码问题
- 计算机最早的运算领域,2013年计算机一级MsOffice模拟试题及答案38
- Fedora 27安装vim插件YouCompleteMe
- VB语言写CRC16校验
- GeoMAN:多层Attention网络用于地理传感器的时序性预测
- 计算机显示器本身物理分辨率,电脑显示器常见的分辨率是多少
- 如何将卫星影像按固定比例尺输出(1:5千,1:1万等)
- vue3+ts 实现防抖功能
- 跨越“数字鸿沟”,日本老年智能化服务的解法
- @开发者,微软 CEO 萨提亚带领 60 位大咖的集结令,你敢接吗?
- 百度wenku的下载
- NLP进阶,Bert+BiLSTM情感分析实战
- java计算ip地址
- 使用ubuntu22.04的ibus键盘的汉语输入法
- K3s+Rainbond默认集群添加server节点
- APP漏洞防护方案与防攻击解决办法