当前位置: 首页 > 面试题库 >

从数据库加载26MB文本数据会消耗258MB的JVM堆

周朗
2023-03-14
问题内容

在启动时本地运行的应用程序(Spring,JPA Hibernate,Sybase
12,Webapp)在基于VisualVM的256MB堆空间中消耗40MB。当我触发返回70,000多行(文本数据无斑点)的搜索时,堆空间图的最大内存为256MB,并耗尽了内存。
我已经通过使用setMaxResults(limit)解决了这个问题。
但是,当我查询相同的数据,将其复制粘贴到文本文件并保存到文件系统时,可以看到该文本大小仅为26MB。

因此,实际上,通过从数据库加载26MB的文本来消耗216MB(从256-40开始), 在内存 不足消耗了190MB
?也许是框架,但是我看不出它可以消耗比实际加载的更多的数据…

__ 再次注意,我使用setMaxResults(limit)解决了这个问题,我的问题不是做什么,而是出于教育目的。


问题答案:

要考虑的一些事情:

您的操作系统可能使用每个字符编码8位的字符来存储文本文件。Java字符串内部全部以每个字符16位编码,是那里的空间的两倍。

只有几个数字的数字将被编码为文本,而不是数字。例如,“ 1”是文本文件中的一个字节字符,但值为1的long则是内存大小的八倍。

hibernate将从SQL结果集中获取值并将其映射到Java对象上,从而产生重复。它可能需要将结果集的内容包装/转换为您在映射上定义的类型。

如果您的每个实体的数据量实际上很小,并且具有大量实体,那么对象开销大小与数据大小的比率显然会很高。

如果集合中的数据很小,则集合的大小可以相对于数据快速增加。在一个极端的例子中,如果您有一个或两个字符串的LinkedList,则指针每实际数据的16-32位仅消耗192位。在数组列表中,指针指向16-32位数据仍将是64位。(当然假设是64位OS。)

您在hibernate状态下加载的每个对象都会被“跟踪”,以在所谓的L1缓存中进行脏检查。实际上,相对于大量具有少量数据的实体的数据大小而言,用于执行此操作的内部数据结构和工具可能存在相当大的开销。

-

因此,假设Java中的所有字符串,没有数字,没有日期,则26MB的数据已经是Java内存中的52MB数据,否则它将更大。

然后,如果将它分成许多小段,即700,000个小字符串而不是1,000个真正的长字符串,那么将数据结构开销的大小变成实际数据大小的三倍是完全合理的,轻松地使您超过200MB。



 类似资料:
  • 问题内容: 是否可以使用Custom Spring PropertyPlaceholderConfigurer从数据库加载属性?提供给自定义PropertyPlaceholderConfigurer的数据源是否有可能在类路径中使用特定的属性文件? 我无法通过以下链接找到满意的答案? http://www.mkyong.com/spring/spring-propertyplaceholdercon

  • 问题内容: 我有一个下拉列表,其中包含从数据库加载的“主题”数据。当我单击一个主题时,应该做的是在文本框内的加载相关的“ subject_id”值,该值恰好位于下拉列表选项下方。我不知道如何从getbook.php带来价值并在book_ID输入文本中显示。 getbook.php 以下是我需要带来价值的文件 问题答案: 该错误是在ajax部分 document.getElementById(“ b

  • 我有一个示例API请求,它返回用户的WatchList列表。我想在用户加载watchlist屏幕时实现以下流程: 差异与 i.Same->一切都很好,因为数据已经显示给用户,什么都不做。 ii.Differs->将保存到本地存储,并将发送到下游。 到目前为止我做了什么? watchlist.kt localstore.kt(Android room) > 实现上述逻辑的最佳方法是什么? 我是否泄漏

  • 很多时候,我们想要绘制文件中的数据。 有许多类型的文件,以及许多方法,你可以使用它们从文件中提取数据来图形化。 在这里,我们将展示几种方法。 首先,我们将使用内置的csv模块加载CSV文件,然后我们将展示如何使用 NumPy(第三方模块)加载文件。 import matplotlib.pyplot as plt import csv x = [] y = [] with open('example

  • 是否可以用Camunda从数据库中加载BPMN XML,而不是在web应用程序中使用文件中的XML? 我们希望能够动态地添加新的工作流,而不是用定义部署新的WAR,这个想法是添加到数据库中,并通知webapp有新的定义。 谢谢,斯科特。

  • 我正在研究一个血液供应链的模拟,并创建和导入了一些表来管理各种代理群体的主数据,如血液处理中心、检测中心、医院等。这些表包含所述代理的名称和lat/lon坐标。 这些表都是MySQL数据库的一部分,我用它的接口连接到AnyLogic,正如我所说,导入了这些表。到目前为止还不错,但是,当我想为每个数据库条目创建代理群体并将代理的参数分配到表的各个字段时,AnyLogic不能将名称(在MySQL中为V