jdk8读取文件

我早些时候发布了博客文章Reading Large Lines Slower in 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

jdk8读取文件

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

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

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

  2. matlab 行 读取文件 跳过_MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)...

    本帖最后由 rocwoods 于 2010-12-29 15:09 编辑 振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html M ...

  3. python读取文件,并指定跳过的行数

    使用with open()读取文件,使用next(file)可以跳过一行 示例代码 def get_data_from_file(file_path, skip_line: int = 0):&quo ...

  4. java读取文件的开头_JAVA编程如何使其读取TXT中以某字母开头的词条。

    BufferedReader有个readLine方法. 每次是读取一行的. 你这最好还是取出来 放在ArrayList里.效率比较高./** * 以行为单位读取文件,常用于读面向行的格式化文件 */ ...

  5. Python快速读取文件中指定的一行或多行

    使用linecache用缓存快速读取,使用栗子如下: 读取一行 import linecachedef get_contexts(file_path, line_number):try:return ...

  6. python读取文件_一日一技:使用Python读取Excel文件

    安装xlrd模块: pip install xlrd 使用xlrd模块,可以从电子表格中检索信息. 例如,可以在Python中完成读取,写入或修改数据的操作. 另外,用户可能必须浏览各种工作表并根据某 ...

  7. BufferedReader.readLine()读取文件第一行会出现bug,首行第一个字符会是一个空字符

    BufferedReader.readLine()读取第一行会出现bug,首行第一个字符会是一个空字符 BufferedReader is =new BufferedReader(new InputS ...

  8. python3程序运行中会跳过注释行,Python: 读取文件时如何忽略#条注释行

    我建议您在看到 # 字符时不要忽略整行.只是忽略其余部分.这可以通过名为 partition 的字符串方法轻松完成: with open("filename") as f: for ...

  9. php读取文件内容不全,php读取文件内容的三种方法

    //**************第一种读取方式***************************** 代码如下: header("content-type:text/html;chars ...

最新文章

  1. main方法_错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为:
  2. 读后感和机翻《人类因果迁移:深度强化学习的挑战》
  3. 如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘
  4. docker删除none镜像_Docker容器相关命令
  5. 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式
  6. [vue-cli]在使用vue-cli开发vue项目时,自动刷新页面的原理你了解吗?
  7. php后门 佛像,35张活的再久,也未必见过的照片,图2是佛像通过CT扫描后内部照...
  8. 在Visual Studio 2005中调试SQL Server 2005的存储过程
  9. java代码建立删除vpn_Java类集综合练习——信息管理(增、删、改、查)
  10. Project: Individual Project - Word frequency program
  11. java 正则表达式 提取ip_使用正则表达式从字符串中提取IP地址
  12. 数据库常见导入文件方法
  13. 单例模式详解(附常见的7种单例模式源码)
  14. css html5布局方式_创建新HTML5&CSS3单页布局– Rock门户
  15. POI在Excel中导出图片(含多图)
  16. 欧洲杯赛场“中国元素”引观众热议;万达两家酒店在延安红街开业窑洞房最具特色 | 美通社头条...
  17. 博弈论战略式表述和扩展式表述
  18. 【硬件学习笔记】防反接保护电路
  19. 前端基础总结--CSS
  20. 关于DoG角点检测matlab实现

热门文章

  1. bzoj4589-Hard Nim【FWT】
  2. nssl1142,jzoj3487-剑与魔法【堆,贪心】
  3. 【2018.5.12】模拟赛之二-ssl2414 简写单词【字符串】
  4. 纪中B组模拟赛总结(2020.2.13)
  5. codeforces gym-101755 I-Guess the Tree 交互题、分治、树的直径
  6. 20、java中的类加载机制
  7. Hadoop入门(十八)Mapreduce的倒排索引程序
  8. 图解elasticsearch原理转载自
  9. Oracle入门(十四.3)之创建PL / SQL块
  10. 漫画算法:找出缺失的整数