探索如何以最小的垃圾收集影响和最大的内存利用率创建堆​​外聚合。


使用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:汇总堆外数据相关推荐

  1. java堆内与堆外数据交互_Java:汇总堆外数据

    java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...

  2. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?

    上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...

  3. java nio 堆外内存_Java堆外内存之突破JVM枷锁

    对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...

  4. java 查看堆外内存占用_Java堆外内存排查小结

    简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解: pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NM ...

  5. java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  6. haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  7. JVM--Java堆外内存--使用/作用

    原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的堆外内存.包括:堆外内存介绍.创建/回收方法.为什么堆外内存能够提升IO效率. 堆外内存简 ...

  8. 日本java69_Java应用监控(10)-NMT堆外内存分析2

    1.概述 是否曾经想过为什么Java应用程序通过众所周知的 -Xms和-Xmx 调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JVM可能会分配额外的本机内存.这些额外的分配最终可能 ...

  9. netty堆外内存的使用

    一.java的堆外内存 堆外内存的限额默认与堆内内存(由-XMX 设定)相同,可用 -XX:MaxDirectMemorySize 重新设定 1.优缺点 优点: (1)可以扩展至更大的内存空间.比如超 ...

最新文章

  1. 才知道创建数据表的后面int(M)的m居然和存储大小没有关系
  2. 机器学习常用激活函数
  3. access database in a helper function ?
  4. python自动化办公pdf-基于python实现自动化办公学习笔记
  5. 解决eclipse中java项目导出成jar包后读写UTF-8文件中文乱码问题
  6. 计算机最早的运算领域,2013年计算机一级MsOffice模拟试题及答案38
  7. Fedora 27安装vim插件YouCompleteMe
  8. VB语言写CRC16校验
  9. GeoMAN:多层Attention网络用于地理传感器的时序性预测
  10. 计算机显示器本身物理分辨率,电脑显示器常见的分辨率是多少
  11. 如何将卫星影像按固定比例尺输出(1:5千,1:1万等)
  12. vue3+ts 实现防抖功能
  13. 跨越“数字鸿沟”,日本老年智能化服务的解法
  14. @开发者,微软 CEO 萨提亚带领 60 位大咖的集结令,你敢接吗?
  15. 百度wenku的下载
  16. NLP进阶,Bert+BiLSTM情感分析实战
  17. java计算ip地址
  18. 使用ubuntu22.04的ibus键盘的汉语输入法
  19. K3s+Rainbond默认集群添加server节点
  20. APP漏洞防护方案与防攻击解决办法

热门文章

  1. 2021牛客暑期多校训练营4 B-Sample Game(概率DP)
  2. codeforces D.MADMAX 动态规划、记忆化搜索
  3. 5、mybatis中的映射器
  4. 汇编语言(十六)之三数值求和
  5. 汇编语言(八)之删除数组中为零的元素
  6. 深入理解分布式系统的2PC和3PC
  7. Java IO: 其他字符流(下)
  8. 好多人都说存储过程很难?认真看这篇文章就够了
  9. ssm(Spring+Spring mvc+mybatis)Service层接口——IDeptService
  10. Springmvc中提交from之后不跳转不进控制器