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

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 。

demoTestGCForJdk4513622

换句话说,当对冗长的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读取文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle_sod,oracle geometry几何关系sdo_Geom.Relate介绍,

oracle geometry几何关系sdo_Geom.Relate介绍&#xff0c;sdo_Geom.Relate(sdo_Geometry1, ‘MASK’, sod_Geometry2, tolerance )&#xff1a;用于判断一个几何体与另一个几何体的关系&#xff0c;我们用于判断当前点是否在某一个面(省份面、县市面、乡镇面)上。参数说明&…

C 11 实现的 100行 线程池

C 线程池一直都是各位程序员们造轮子的首选项目之一。今天&#xff0c;小编带大家一起来看看这个轻量的线程池&#xff0c;本线程池是header-only的&#xff0c;并且整个文件只有100行&#xff0c;其中C 的高级用法有很多&#xff0c;很值得我们学习&#xff0c;一起来看看吧。…

oracle把多行合并成字符串,怎样将Oracle多行转换成字符串?

在做一些比较复杂的DB数据导出时&#xff0c;有时会要求“将不固定的多行数据组合成一个字符串返回”。例子&#xff1a;ISV Portal中就遇到了类似的情况&#xff0c;要求对于每一个APP&#xff0c;返回其所属的所有类目名称&#xff0c;类目名称之间用[,]隔开。本文就用此例子…

openshift使用_OpenShift v3:使用WildFly和MySQL的Java EE 7入门

openshift使用OpenShift是Red Hat的开源PaaS平台。 OpenShift v3 &#xff08;将于今年发布&#xff09;将提供使用Docker和Kubernetes运行微服务的整体体验。 以经典的Red Hat方式&#xff0c;所有工作都在OpenShift Origin的开源中完成。 这也将推动OpenShift Online和OpenSh…

c程序的基本组成单位是什么?

C程序是由函数构成的。函数是C程序的基本组成单位。一个C源程序中仅有一个main()函数,除main函数之外可以有若干个其它的函数。每个函数实现某一特定的操作。因此&#xff0c;函数是C程序的基本单位。一个函数由两部分组成&#xff1a;函数的说明部分。包括函数名、函数类型、函…

java多线程 异常处理_Java8多线程ForkJoinPool:处理异常

java多线程 异常处理引入Java8 lambda背后的主要动机之一是能够尽可能轻松地使用多核的能力&#xff08;请参阅精通Lambdas&#xff1a;多核世界中的Java编程 &#xff09;。 只需将代码从collection.stream()...更改为collection.parallelStream()...您就可以使用即时多线程&a…

C语言头文件 “ 细节 ”

很多事不深入以为自己懂了&#xff0c;但真正用到项目上&#xff0c;才发现了问题。曾以为自己写C语言已经轻车熟路了&#xff0c;特别是对软件文件的工程管理上&#xff0c;因为心里对自己的代码编写风格还是有自信的。(毕竟刚毕业时老大对我最初的训练就是编码格式的规范化处…

订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...

原标题&#xff1a;一步步教你怎么打造微信公众号历史文章爬虫开篇语&#xff1a;邓爷爷曾说过&#xff1a;不管黑猫白猫&#xff0c;逮到耗子就是好猫。不管我是凑的还是笨办法堆出来的&#xff0c;确实把批量导出微信公众号所有历史文章的这个功能给做出来了&#xff0c;而且…

oracle中悲观锁定_如何使用悲观锁定修复乐观锁定竞争条件

oracle中悲观锁定回顾 在我以前的文章中 &#xff0c;我解释了使用显式乐观锁定的好处。 然后我们发现&#xff0c;在很短的时间范围内&#xff0c;并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改。 此问题可以描述如下&#xff1a; 爱丽丝拿产品 然后&#…

初学者宝典:C语言入门基础知识大全(中)

04常量在程序运行中&#xff0c;其值不能被改变的量称为常量。常量有5种类型&#xff1a;整型常量、实型常量、字符常量、字符串常量和符号常量。4.1 数值转换—数值的四种表现形式&#xff1a;①&#xff1a;二进制&#xff1a;所有数字由0,1构成&#xff0c;逢二进一&#xf…

linux命令创建硬链接,Linux终端命令接口(十一)硬链接与软连接

一、进入终端 输入 使用 ls -l 即可.示例:$ touch file1 # 创建新文件 file1$ touch file2 # 创建新文件 file2$ ln file1 file3 # 为 file1 创建硬链接 file3$ ls -ltotal 0-rw-r--r-- 2 root root 0 01-25 16:59 file1-rw-r--r-- 1 root root 0 01-25 17:00 f…

stateless_Spring Stateless State Security第3部分:JWT +社会认证

stateless我的Stateless Spring Security系列文章的第三部分也是最后一部分是关于将基于JWT令牌的身份验证与spring-social-security混合在一起的。 这篇文章直接建立在它的基础上&#xff0c;并且主要集中在已更改的部分上。 想法是使用基于OAuth 2的“使用Facebook登录”功能…

return在c语言中是什么意思

函数是C语言的基本构件&#xff0c;一个C程序可以由一个主函数和若干个子程序函数构成&#xff0c;由主函数调用其它子程序函数&#xff0c;其他子程序函数也可以互相调用。通常希望通过函数调用使主函数能得到一个确定的值&#xff0c;这就是函数的返回值。在C语言中通过函数实…

为什么非阻塞io性能更好_提高性能:流的非阻塞处理

为什么非阻塞io性能更好1.简介 想象一下&#xff0c;我们有一个需要访问外部Web服务的应用程序&#xff0c;以便收集有关客户端的信息&#xff0c;然后对其进行处理。 更具体地说&#xff0c;我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端&#xff0c;则…

linux history文件路径,Linux、Unix常用命令(文件和目录相关)

mkdir dirname 建立子目录. 注意:用户不能在一个不存在的目录中建立子目录。mkdir data 在当前目录下建立子目录 datamkdir /usr/data 在/usr/目录下建立子目录 data&#xff0c;此时/usr 目录必须已经存在。rmdirrmdir dirname 删除空目录&#xff0c;目录里面如有文件或目录则…

c语言的输入函数有哪些

c语言的输入函数有&#xff1a;1、scanf的返回值scanf()函数返回成功赋值的数据项数&#xff0c;读到文件末尾出错时则返回EOF。如&#xff1a;scanf("%d%d", &a, &b);如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0…

php cdi_CDI和EJB:在事务成功时发送异步邮件

php cdi再次问好&#xff01; :) 这次&#xff0c;我选择了一项常见任务&#xff0c;我认为大多数情况下都以错误的方式完成&#xff1a;发送电子邮件。 并非所有人都不知道电子邮件API的工作方式&#xff0c;例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&…

linux中多进程调试,linux下用gdb调试多进程

今天来学习一下linux下gdb如何调试多进程&#xff0c;在学习之前我我们能先看一张表&#xff1a;这张表是gdb调试的命令表&#xff0c;这对那些对gdb不熟的同学来说是非常有必要的。一、多进程调试的命令1、set follow-fork-mode parent|child因为gdb在一般情况下&#xff0c;只…

初学者宝典:C语言入门基础知识大全(下)

06类型的自动转换和强制转换当同一表达式中各数据的类型不同时&#xff0c;编译程序会自动把它们转变成同一类型后再进行计算。转换优先级为&#xff1a;char < int < float < double 即左边级别“低“的类型向右边转换。具体地说&#xff0c;若在表达式中优先级最高的…

linux接口 头文件,第一种:1、添加关键头文件:#include linux/of_gpio.h#include linux/gpio.h...

第一种&#xff1a;1、添加关键头文件&#xff1a;#include #include #include #include #include #include 2、在已经存在驱动文件中搜索"DEVICE_ATTR"关键字&#xff0c;如果存在&#xff0c;直接参考已经存在的方法添加一个即可&#xff0c;如下&#xff1a;unsig…