- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
短版:如果调用string.substring(n,m).intern(),字符串表是保留子字符串还是保留原字符串?
...但我不确定这是一个正确的问题,所以这里是长版本:
我正在使用遗留 Java 代码 (PCGen),它通过将每个文件作为一个大字符串来解析文件,然后使用 String.split、.trim、.substring 和 StringTokenizer 将它们分解为 token 。这对于解析非常有效,因为这些方法都不会复制原始字符串,而是都指向共享 char[] 的一部分。
解析结束后,我想回收一些内存。只需要原始大字符串的几个小子字符串,但强引用阻止了大字符串被收集。后来我遭受了 OOM,我相信部分原因是大量已解析文件的巨大堆影响。
我知道我可以通过 new String(String)
(copy-on-write) 修剪大字符串。而且我知道我可以通过 String.intern 减少字符串重复(这很重要,因为解析的文件中有很多冗余)。我需要同时使用两者来回收最大数量的堆,还是 .intern() 两者都做?阅读 OpenJDK7 热点源代码(hotspot/src/share/vm/classfile/symbolTable.cpp),看起来字符串表保留了整个字符串,并且根本没有修剪它的偏移量/长度。所以我想我需要制作一个新的字符串,然后实习这个结果。对吧?
话虽如此,切换到流式解析器在内存方面将是一个巨大的胜利,但对于短期而言这变化太大了。
最佳答案
您可以使用 new String(String) 和 intern() 方法,这将根据 Java 7 update 4 的要求进行复制。从 Java 7 update 5 开始,子字符串将获得更深的副本,但您可能仍需要使用实习生()。注意:Java 7 使用堆而不是 perm gen 来存储字符串文字。
public static void main(String[] args) {
char[] chars = new char[128];
Arrays.fill(chars, 'A');
String a128 = new String(chars);
printValueFor("a128", a128);
String a16 = a128.substring(0, 16);
printValueFor("a16", a16);
}
public static void printValueFor(String desc, String s) {
try {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
char[] valueArr = (char[]) value.get(s);
System.out.println(desc + ": " + Integer.toHexString(System.identityHashCode(valueArr)) + ", len=" + valueArr.length);
} catch (Exception e) {
throw new AssertionError(e);
}
}
在 Java 7 更新 4 上打印
a128: 513e86ec, len=128
a16: 53281264, len=16
我希望 Java 6 不会这样做。
关于java - 通过子字符串解析后如何回收内存?实习生()还是新字符串()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14516635/
当前,我们在为 JS 测试套件运行 Intern 测试运行程序时遇到以下错误。 fatal error :CALL_AND_RETRY_LAST 分配失败 - 进程内存不足 此错误发生在任何测试信息通
我在 intern-geezer 中运行了一个测试循环,一百个非常相似的测试中约有二十个成功运行。然后突然: FATAL ERROR ReferenceError: window is not def
为什么 Python 的 intern 只针对字符串内置?应该可以将 intern 扩展到可哈希和可比较的类,对吧? 最佳答案 实习事物的目的是能够通过比较它们的内存地址来比较它们;您确保永远不会创建
使用 Selenium 驱动程序,IE 在 session 之间保持登录状态,而 FF 和 Chrome 则不然。我想根据“已登录”元素 ID 的存在在测试中执行一些附加命令。 如何根据实习生中的条件
我正在使用以下代码运行我的实习生测试 node node_modules/intern/runner.js config=tests/intern 在我的本地计算机上。该应用程序正在使用 Dojo。基
我有一个有2个功能套件的项目,结构是这样的: - /tests --- /sign ------ sign.js --- /buy ------ buy.js --- intern.js - /nod
我有一个结果集,其中包含证券交易所及其所在国家/地区的列表。尽管如此,在我的数据库中,并非每个 Cxchange 都有一个country_id,因此在创建 Exchange 对象时,其中一堆具有cou
我在实习生如何运行测试和尝试测试使用 jQuery 的 AJAX 调用的单元方面遇到了问题。由于 Intern 将测试客户端提供给 WebDriver 服务器(在本例中为 phantomjs --we
我在一个包中加载测试时遇到问题,该包的依赖项是被测试包的 sibling 。 目前提交的乱码在https://github.com/lbod/delite/tree/intern-bforbes-se
我尝试更改完整的 CSS 代码(如样式浏览器)。 第一个解决方案 new_css = ' body {color:#00ff00; } #div { border: 1px solid red; }'
短版:如果调用string.substring(n,m).intern(),字符串表是保留子字符串还是保留原字符串? ...但我不确定这是一个正确的问题,所以这里是长版本: 我正在使用遗留 Java
如何模拟此功能?使用 WaitForDeletedById 似乎是一种有意识的选择,但反过来却不行。 在 ajax 加载后,我如何才能等待页面上存在新元素,而不是不存在新元素? 最佳答案 使用setF
当我尝试从我的测试文件目录中运行实习生测试时看到此错误消息。目录的(相关)结构是: 测试 资源 休息 pickup.js 现金管理.js gitignore intern.js packages.js
我正在为我们构建的具有“只读”功能的自定义下拉控件编写功能测试。我们为此提出的原始测试计划是确保单击下拉菜单时不会绘制“列表”,这是通常会发生的情况。在绘制列表之前,列表的标记并不存在于 DOM 中。
我正在尝试让 intern-cucumber 插件正常工作。我收到以下错误: Error: A plugin named "cucumber" has not been registered at
我在新安装和更新的 Windows 8.1 N x64 VM 上运行 VS2015 CTP6。 Hyper-V support is enabled , hypervisor.cpuid.v0 = "
为简单起见,假设我有以下 DOM 结构: A B C
我对这个本来很简单的问题越来越绝望。 执行: bdd.it('works', function() { return this.remote .get(
我最近开始使用 Intern js 和 Saucelabs 进行 ui 测试。想要在所有浏览器中进行测试,显然 Firefox 也不排除。 这是我的 gruntfile 配置: run
我正在尝试通过运行 headless Chrome 浏览器进行测试来使用 Intern 4 进行功能测试。我相信一切都设置正确,并且最近为 Mac 终端安装了 selenium-server-stan
我是一名优秀的程序员,十分优秀!