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

  1. 前后端数据交互方法 汇总

    这篇文章给大家介绍几种常用的前后端数据交互方法,并给出使用建议.以提高前后端协同开发的效率.非常的详细,推荐给小伙伴们,有需要的小伙伴可以参考下. 1.HTML赋值 输出到 Element 的 val ...

  2. java tcp数据包_java tcp封装成数据包【相关词_ tcp数据包处理java】

    2-1.数据序号32位,TCP为发送的每一个字节都编一个号码,这里存储当前数据包数据第一 包括 网络编程结构数据JavaTCPIP的信息,所有JAVA网络编程:TCP/IP数据包结构相关内 Java实 ...

  3. java mysql插入数据乱码_java连接mysql插入数据出现中文乱码

    java连接了mysql数据库后,程序行向数据库中插入信息,代码如下: dbhelper boringdb = new dbhelper(); boringdb.connSQL(); String i ...

  4. java如何写外键关联_JAVA基础:Hibernate外键关联与HQL语法

    例如对于TUser类 1.实体查询 String hql = " from TUser"; 执行这条语句会返回TUser以及TUser子类的纪录. 注: 如果 TUser 类具有外 ...

  5. java xml数据解析_java xml解析,数据读取

    xml格式<?xmlversion ="1.0"encoding="UTF-8"?> xml格式 32 寺坡镇管理员 202cb962ac59075 ...

  6. java数据查询_Java中的大量数据查询

    问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询数据库,而查询结果是上千条甚至是上百万条记录,要求查询 问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询 ...

  7. 实现前后端数据交互方法汇总

    此文章适合前后端协同开发经验不足的新手阅读. HTML赋值 输出到 Element 的 value 或 data-name <input type="hidden" valu ...

  8. vuejs前后端数据交互之从后端请求数据

    本文将向大家介绍一种用vue-resource从后端请求数据的方法. 比如说从后端请求一张表过来, (1)首先,在data中return一个msg:[]数组来接收表的数据: (2)在方法中定义一个请求 ...

  9. alert导致ajax数据交互问题,用ajax获得数据,可是页面显示的时不加个alert就显示不出来,随意加个alert就可以 解决办法...

    这是因为Ajax的异步处理的引起的 只需要把jquery中的$.ajaxSettings.async = false; 就可以了 默认为true; AJax可以通过两种方法访问服务器,即同步(脚本会停 ...

最新文章

  1. intval0.57100 php_php中0,'',null,false,true,FLASE,TREU,array()的相等恒等学习
  2. hdu 1724 Ellipse——辛普森积分
  3. Angular 4 依赖注入教程之一 依赖注入简介
  4. 爬虫篇 --- 分布式爬虫
  5. Spring之RestTemplate如何返回map结果集
  6. SAP Spartacus如何判断用户是否已经成功登录
  7. uva 10723——Cyborg Genes
  8. Java中int[]与Integer[]相互转化的方法
  9. php添加导航和删除导航,新增/修改/删除ECSHOP后台左侧导航菜单
  10. 如何使用AdminStudio软件把.exe转换成.msi
  11. 《大师谈游戏设计——创意与节奏》【笔记一】
  12. Java—筛选法求素数
  13. 手机投屏到电脑完美教程,安卓和苹果用户均可使用
  14. c语言中 输入有两行:第一行是一个正整数n,第二行是n个整数,c语言问题:输入格式 输入有多组数据.每组数据两行.第一行包含一个正整数n(小于等于1000...
  15. json数组排序,深拷贝,浅拷贝,删除,增加,筛选,
  16. 怎么压缩图片200k以下?
  17. 菜鸟学习OGRE和天龙八部之三: GridInfo和HeightMap文件的数据格式(已更正)
  18. 一个网口接网线,另一个网口做转发,用网线连接另一个电脑
  19. Apache配置一级反向代理和二级反向代理实现目录网站管理
  20. vue js根据生日计算年龄(包含阳历和农历)

热门文章

  1. 牛客题霸 [括号序列] C++题解/答案
  2. 牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C++题解/答案
  3. [SCOI2007] 修车(费用流 + 差分时间段建图)
  4. [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
  5. Message Decoding密码翻译
  6. Loj#6053-简单的函数【Min25筛】
  7. 【DP】饥饿的WZK(jzoj 1998)
  8. 5、mysql中的库操作
  9. 19、java中枚举
  10. 自然语言处理中的Attention Model:是什么以及为什么[一]