- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个在 Windows Mobile 设备上运行的 Java 应用程序。为了实现这一点,我们一直在使用 Esmertec JBed JVM,它并不完美,但我们现在坚持使用它。最近我们收到了客户关于 OutOfMemoryErrors 的投诉。在玩了很多东西后,我发现该设备有足够的可用内存(大约 4MB)。
OutOfMemoryErrors 总是发生在代码中的同一点,即在扩展 StringBuffer 以向其附加一些字符时。在这个区域周围添加了一些日志之后,我发现我的 StringBuffer 中有大约 290000 个字符,容量大约为 290500。内部字符数组的扩展策略只是将大小加倍,所以它会尝试分配一个数组大约 580000 个字符。我也打印了这段时间的内存使用情况,发现它使用了大约 3.8MB,总共大约 6.8MB(尽管我看到总可用内存有时会上升到大约 12MB,所以有很大的扩展空间)。因此,此时应用程序报告了 OutOfMemoryError,考虑到还有多少可用空间,这没有多大意义。
到目前为止,我开始考虑应用程序的操作。基本上正在发生的事情是我正在使用 MinML(一个小型 XML Sax 解析器)解析一个 XML 文件。 XML 中的一个字段包含大约 300k 个字符。解析器从磁盘流式传输数据,默认情况下一次只加载 256 个字符。因此,当它到达有问题的字段时,解析器将调用处理程序的“characters()”方法超过 1000 次。每次它将创建一个包含 256 个字符的新 char[]。处理程序只是将这些字符附加到 StringBuffer。 StringBuffer 的默认初始大小仅为 12,因此当字符被附加到缓冲区时,它将不得不增长多次(每次创建一个新的 char[])。
我的假设是,虽然有足够的空闲内存,因为以前的 char[] 可以被垃圾收集,但可能没有足够大的连续内存块来容纳我试图分配的新数组.并且可能 JVM 不够聪明,无法扩展堆大小,因为它很愚蠢,认为没有必要,因为显然有足够的空闲内存。
所以我的问题是:是否有人对此 JVM 有任何经验,并且可能能够最终证实或反驳我对内存分配的假设?另外,有没有人有任何想法(假设我的假设是正确的)关于如何改进数组的分配以使内存不会变得碎片化?
注意:我已经尝试过的事情:
做这两件事有点帮助,但是当我增加输入的 xml 数据的大小时,我仍然会在相当小的大小(大约 350kb)处得到 OutOfMemoryErrors。
要补充一点:所有这些测试都是在使用相关 JVM 的设备上执行的。如果我使用 Java SE 1.2 JVM 在桌面上运行相同的代码,我没有任何问题,或者至少在我的数据大小达到大约 4MB 之前我不会遇到问题。
编辑:
我刚刚尝试过的另一件事是我将 Xms 设置为 10M。所以这解决了 JVM 没有在应该扩展堆的时候扩展堆的问题,并允许我在错误发生之前处理更多数据。
最佳答案
也许你可以试试VTD光。它似乎比 SAX 更节省内存。 (我知道这是一个巨大的变化。)
关于java - 在 Java 中分配大量数组时避免内存碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066808/
我今天在这里看到了 Ayende 关于 NH 分片的文章 http://ayende.com/blog/4252/nhibernate-shards-progress-report .我第一次听说 N
我正在尝试使用 Scrapy 和 Cloudflare 抓取 URL,但我无法获得任何结果: 2018-07-09 22:14:00 [scrapy.core.engine] INFO: Spider
我用于调试日志的Graylog2服务器上存在一些磁盘问题。现在有未分配的分片: curl -XGET http://host:9200/_cat/shards graylog_292 1 p STAR
我正在做一个小机器人,它应该提供来自网站(ebay)的信息并使用 splinter 和 python 将其放入列表中。我的第一行代码: from splinter import Browser wit
我正在尝试通过 splinter 从模态框的下拉菜单中选择内容。我很容易找到这个下拉菜单,例如: (Pdb) dropdown = next(i for i in my_browser.find_by
我的 APC 总是达到 100% 碎片。我的 VPS 有 1GB 内存,APC 分配给它 256mb,但它只使用了 256mb 中平均 100mb(最大 150mb)的内存。 我必须重新启动 php-
所以我正在使用 python splinter library测试一个网络应用程序,当我检查一个元素是否存在并且我手动找到每个元素来操作它时,我遇到了一个问题。 问题是,当输入列表大于 4 项或更多时
我尝试从具有以下 html 代码的下拉列表中选择“本地主机”: Local Host ah005 这是我的 pyt
我正在使用 Spring 和 Thymeleaf 开发应用程序,我想知道如何使用 thymeleaf 片段。 Thymeleaf 与 JSP 的优点是我们不必运行应用程序来查看模板,但是,当我们将模板
我在 linux 上用 ping 做了一些测试,我有点好奇 DF 位和碎片是如何工作的。我一直在发送一些带有命令 -M do 的包和一些带有 -M dont 的包,我意识到即使发送小于 MTU 的包,
我尝试从原始 H264 视频数据创建片段 MP4,以便我可以在互联网浏览器的播放器中播放它。我的目标是创建实时流媒体系统,媒体服务器会将碎片化的 MP4 片段发送到浏览器。服务器将缓冲来自 Raspb
在 mongodb 中。如果你想构建一个有两个分片的生产系统,每个分片都是一个具有三个节点的副本集,你必须启动多少 mongod 进程? 为什么答案是9? 最佳答案 因为每个分片需要 3 个副本 x
我是 python 和 scrapy 的新手。我正在尝试遵循 Scrapy 教程,但我不明白 storage step 的逻辑. scrapy crawl spidername -o items.js
1、Sharding 的应用场景一般都那些? 当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大。试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,
我正在通过以太网发送 2000 字节 JSON(以太网 MTU 1500 字节),因为我的数据包大于以太网 MTU,所以我的消息被分段,如您在下面的 Wireshark 捕获中看到的那样。现在我正在尝
我决定为我的文档实现以下 ID 策略,它将文档“类型”与 ID 结合起来: doc.id = "docType_" + Guid.NewGuid().ToString("n"); // create
是否可以编写 ip6tables 规则来阻止格式错误的 ipv6 分段数据包。这基本上是为了我们电器盒的ipv6认证。我们运行在:rhel 5.5 和内核:2.6.18-238.1.1.el5 我们目
有很多关于 .NET LOH 的可用信息,并且已经在各种文章中进行了解释。但是,似乎有些文章不够精确。 过时信息 在Brian Rasmussen's answer (2009), program m
我还有一个 Unresolved 问题 HERE关于一些可能涉及 LOH 碎片以及其他未知数的绝望内存问题。 我现在的问题是,公认的做事方式是什么?如果我的应用程序需要在 Visual C# 中完成,
经过 20 年的专业发展,我仍然发现自己对数据库性能的某些方面一无所知。这是那些时代之一。这里和其他地方有数以千计的关于表和索引碎片及其对性能影响的问题。我知道基本的注意事项,但有时似乎没有“好的”答
我是一名优秀的程序员,十分优秀!