- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用了一个包含大量数据的变量,比如 String data
。我想通过以下方式使用这个字符串的一小部分:
this.smallpart = data.substring(12,18);
经过几个小时的调试(使用内存可视化工具),我发现对象字段 smallpart
记住了 data
中的所有数据,尽管它只包含子字符串。
当我把代码改成:
this.smallpart = data.substring(12,18)+"";
..问题解决了!现在我的应用程序现在使用的内存很少!
这怎么可能?谁能解释一下?我认为 this.smallpart 一直在引用数据,但为什么呢?
更新:那我怎样才能清除大字符串呢? data = new String(data.substring(0,100)) 会这样做吗?
最佳答案
执行以下操作:
data.substring(x, y) + ""
创建一个新的(较小的)String 对象,并丢弃对由 substring() 创建的 String 的引用,从而启用对此的垃圾回收。
要意识到的重要一点是,substring()
为 现有 字符串提供了一个窗口——或者更确切地说,是原始字符串下面的字符数组。因此它将消耗与原始字符串相同的内存。这在某些情况下可能是有利的,但如果您想获取子字符串并处理原始字符串(如您所见),则会出现问题。
看看substring() method在 JDK 字符串源中获取更多信息。
编辑:要回答您的补充问题,从子字符串构造一个新字符串将减少您的内存消耗,提供您将任何对原始字符串的引用合并。
注意(2013 年 1 月)。上述行为已更改in Java 7u6 .享元模式不再使用,substring()
将按照您的预期工作。
关于java - 为什么将 ""附加到字符串可以节省内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147783/
我试图找出在将数据传输到设备之前将数据复制到固定内存是否有意义,因为我对输入数据的分配没有影响(它是一个库)。 std::vector idata(WORK_SIZE); int *idata_ali
model.save() 让我很困惑。 示例。我将我的 mongoose.model(mongoose.schema) 移动到单独的 model.js 文件中。当我使用这种方法创建模型时,以下问题困扰
我正在用 Java Swing 制作模拟时钟。要计算我需要的时钟指针角度: 我可以通过 System.currentTimeMillis() 获得的以毫秒为单位的 UTC 时间 时区偏移 TimeZo
编辑 我的应用程序中有声音,该声音在应用程序启动时开始播放。此外,我还有两种播放和停止声音的方法: -(void)playBgMusic { NSString *path = [[NSBundle m
所以我的应用有 1 个 Activity 和 4 个 fragment ,其中一个有 Chronometer 来显示经过了多少时间。 它工作正常,但我有一个问题,每次我移动到另一个 fragment
我是 FireDAC 新手,遇到问题。我想在Delphi XE7中使用FireDAC读写SQLite数据库。我尝试的大部分方法都有效,但我在将 TTime 保存到 SQLite DB 时遇到问题。 这
这是我使用基本 Node.js 服务器创建的示例站点。我能够成功发布、创建给定架构的用户,然后“保存”到数据库;但是,保存不会返回用户对象,并且在我的实际数据库中找不到。连接也返回成功。 main.j
我有一台配备 2 Gb Nvidia GPU 的 Mac Book Pro。我正在尝试利用我所有的 GPU 内存进行计算(python 代码)。如果我绕过 GUI 界面并仅通过命令行访问我的机器,我可
我希望使用 Powerpoint 创建一种测验,我想保存用户提供的输入。 例如:如果我问这个问题:你最喜欢什么颜色?当他们回答问题并单击下一步按钮时,我想保存文本框的值并将其附加到输出文件中。 我已经
我是一名优秀的程序员,十分优秀!