我之前发布了博客文章“使用JDK 7和JDK 8读取慢速行”,并且在该问题上有一些有用的评论来描述该问题。 这篇文章提供了更多解释,说明为何该文章中演示的文件读取(并由Ant的LineContainsRegExp使用 )在Java 7和Java 8中比在Java 6中这么慢。

X Wang的帖子JDK 6和JDK 7中的substring()方法描述了如何在JDK 6和JDK 7之间更改String.substring() 。Wang在该帖子中写道,JDK 6 substring() “创建了一个新字符串,但字符串的值仍指向堆中相同的[backing char]数组。” 他与JDK 7方法形成对比,“在JDK 7中,substring()方法实际上在堆中创建了一个新数组。”

Wang的文章对于理解Java 6和Java 7之间String.substring()的区别非常有用。这篇文章的评论也很有见地。 这些评论包括我很感激的观点 ,“我会说'不同'而不是'改善'。” 也有关于JDK 7如何避免 JDK 6中可能发生的潜在内存泄漏的解释 。

StackOverflow线程Java 7字符串–子字符串的复杂性解释了更改的动机,并引用了JDK-4513622错误:(str)保留字段的子字符串会阻止对象的GC 。 该错误指出:“ [发生OutOfMemory错误,因为如果调用者在对象中存储字段的子字符串,则对象不会被垃圾回收。” 该错误包含演示此错误发生的示例代码。 我在这里修改了该代码:

/*** Minimally adapted from Bug JDK-4513622.** {@link http://bugs.java.com/view_bug.do?bug_id=4513622}*/
public class TestGC
{private String largeString = new String(new byte[100000]);private String getString(){return this.largeString.substring(0,2);}public static void main(String[] args){java.util.ArrayList<String> list = new java.util.ArrayList<String>();for (int i = 0; i < 1000000; i++){final TestGC gc = new TestGC();list.add(gc.getString());}}
}

下一个屏幕快照展示了用Java 6(jdk1.6是可执行Java启动程序路径的一部分)和Java 8(主机上的默认版本)执行的最后一个代码段(从Bug JDK-4513622改编而成)。 如屏幕快照所示,在Java 6中运行代码时抛出OutOfMemoryError ,而在Java 8中运行时不抛出OutOfMemoryError 。

换句话说,当对冗长的Java字符串执行String.substring时,Java 7中的更改修复了潜在的内存泄漏,但以性能影响为代价。 这意味着使用String.substring (包括Ant的LineContainsRegExp)来处理很长的行的任何实现都可能需要更改以不同的方式实现,或者在从Java 6迁移到Java 7及更高版本时处理很长的行时应避免使用。

一旦知道了问题(在这种情况下更改String.substring实现),就可以更轻松地在线查找有关正在发生的事情的文档(感谢提供了使这些资源易于查找的注释)。 JDK-4513622的重复错误包含提供额外详细信息的内容。 这些错误是JDK-4637640:由于String.substring()实现而导致的内存泄漏和JDK-6294060:使用substring()导致了内存泄漏 。 其他相关的在线资源包括Java 7中对String.substring的更改 (其中包括对String.intern()的引用-有更好的方法 ), Java 6与Java 7:当实现很重要时 ,以及受到高度评价的(超过350条注释) Reddit线程TIL Oracle更改了Java 7 Update 6中的内部String表示,从而将子字符串方法的运行时间从常量更改为N。

用Java 1.7.0_06进行的更改为String内部表示的文章很好地回顾了此更改,并总结了原始问题,修复程序以及与该修复程序相关的新问题:

现在您可以忘记上面描述的内存泄漏,并且永远不再使用新的String(String)构造函数。 作为缺点,您现在必须记住String.substring现在具有线性复杂度,而不是恒定的复杂度。

翻译自: https://www.javacodegeeks.com/2015/01/reason-for-slower-reading-of-large-lines-in-jdk-7-and-jdk-8.html

JDK 7和JDK 8中大行读取速度较慢的原因相关推荐

  1. jdk8读取文件_JDK 7和JDK 8中大行读取速度较慢的原因

    jdk8读取文件 我早些时候发布了博客文章Reading Large Lines Slower in JDK 7和JDK 8,并且在描述该问题的文章上有一些有用的评论 . 这篇文章提供了更多解释,说明 ...

  2. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试

    文章目录 1.安装jdk配置环境 2.cmd命令行测试环境变量配置是否正确及运行java程序 3.安装IDEA编写代码测试 1.安装jdk配置环境 首先打开官网Oracle https://www.o ...

  3. 什么是JDK?Java JDK 下载,安装与环境变量配置注意点。使用记事本编写运行环境配置后的第一个Java程序

    万事开头难.在了解什么是 Java.Java 语言的特点以及学习方法之后,本节将介绍如何搭建编写 Java 程序所需要的开发环境--JDK(Java Development Kit). JDK 是一种 ...

  4. The substring() Method in JDK 6 and JDK 7

    2019独角兽企业重金招聘Python工程师标准>>> 1. What substring() does? The substring(int beginIndex, int end ...

  5. 在JDK 6和JDK 7的substring()方法的区别?

    原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...

  6. Python按行读取文件、写文件

    Python按行读取文件 学习了:https://www.cnblogs.com/scse11061160/p/5605190.html file = open("sample.txt&qu ...

  7. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

  8. The substring() Method in JDK 6 and JDK 7 (jdk6中的substring()会造成内存泄漏)

    参考:http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ The substring(int be ...

  9. java 按行读取大文件文件内容_Java实现按行读取大文件

    Java实现按行读取大文件 String file = "F:" + File.separator + "a.txt"; FileInputStream fis ...

最新文章

  1. 再也不买仙剑正版盘了
  2. 如何利用Gephi可视化浏览的网站关系
  3. android软件的data使用方法,实例讲解Android中SQLiteDatabase使用方法
  4. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析
  5. ubuntu 10.04   花屏   启动缓慢   处理办法
  6. 给学习java web新手们的建议和推荐一些书籍
  7. python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解
  8. mysql安装zip怎么安装可视化_Mysql zip压缩版安装步骤总结
  9. i8一点通无盘解决方案
  10. Pr 音频效果参考:滤波器与 EQ
  11. 如何下载历史版本和最新版本的iar
  12. Ubuntu笔记本设置WiFi热点
  13. Unity WebGL 获取当期时间DateTime.Now异常问题
  14. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
  15. 【数据去噪】SG-多项式平滑算法
  16. 整理一些全志 D1 / D1s 的 DisplayEngine / LCD / HDMI 常用骚操作
  17. java 记录微信转发次数_微信分享追踪分析系统 ,可以精细统计朋友圈访客来访次数及时间和转发...
  18. Java_Set接口
  19. 仿SDWebImage
  20. 基于人工智能算法的多元负荷预测

热门文章

  1. 关于文档的基本操作---ElasticSearch
  2. Ajax前后端对接---Springmvc
  3. html点击弹出iframe,JavaScript:关于跨iframe弹窗
  4. pythondocx模板_使用python-docx-template修改word文档
  5. 分类算法中常用的评价指标
  6. JavaWeb核心常用API一览
  7. fork join框架_Java中的Fork / Join框架的简要概述
  8. java jpa 异步编程_异步处理时的JPA
  9. spark wai_WAI-ARIA对自动完成小部件的支持
  10. hazelcast_Hazelcast的MapLoader陷阱