龙空技术网

读Java性能权威指南(第2版)笔记02_ Java SE API技巧上

躺着的柒 121

前言:

现在我们对“javaseapi”大概比较珍视,你们都想要知道一些“javaseapi”的相关资讯。那么小编在网上搜集了一些对于“javaseapi””的相关文章,希望兄弟们能喜欢,姐妹们快快来了解一下吧!

读Java性能权威指南(第2版)笔记02_ Java SE API技巧上

1.压缩字符串1.1.Java 61.2.实验性1.3.compressed string2.字符串2.1.Java 82.2.所有都会编码为16位字符数组3.紧凑字符串3.1.Java 113.2.compact string3.3.8位字节数组3.3.1.节约大量内存3.4.-XX:+CompactStrings标志控制的3.4.1.默认是true3.5.很成熟且性能良好3.6.例外是应用程序中所有的字符串都需要16位编码3.6.1.在紧凑字符串中对这些字符串进行操作的时间可能会稍长一些4.删除重复字符串4.1.G1 GC执行自动去重4.1.1.让JVM找到重复字符串后去重(deduplicate)4.1.1.1.使用G1 GC并指定-XX:+UseStringDeduplication标志时才能做到4.1.1.2.存在于20版本之后的Java 8和所有版本的Java 11中4.1.1.3.默认是false4.1.2.默认情况下没有开启的原因4.1.2.1.在G1 GC的新生代回收和混合回收阶段进行额外的处理,这会延长回收的时间4.1.2.2.需要一个额外的线程与应用程序线程同时运行,这可能会占用应用程序线程的CPU周期4.1.2.3.重复字符串很少,那么应用程序的内存使用量会更高(而不是更低),这些额外占用的内存来自于跟踪所有字符串以寻找重复而产生的簿记工作4.1.3.运行时4.1.3.1.Java 8的-XX:+PrintStringDeduplicationStatistics标志4.1.3.2.Java 11的-Xlog:gc+stringdedup*=debug标志4.1.4.晋升的字符串可以进行去重的时间点4.1.4.1.-XX:StringDeduplicationAgeThreshold=N标志控制的4.1.4.2.默认值是34.2.String类的intern()方法来创建字符串的标准化版本4.3.自定义方法来创建字符串的标准化版本5.字符串保留5.1.使用String类的intern()方法5.1.1.查看字符串表的执行情况5.1.1.1.-XX:+PrintStringTableStatistics标志运行你的应用程序5.1.1.2.默认是false5.1.2.只有当应用程序在一组相同长度的字符串上进行大量的重复比较时,才可以预期字符串比较能从intern()方法的使用中受益5.1.3.intern()方法的性能是由字符串所在哈希表大小的优化程度主导的5.2.原生哈希表有固定的大小5.2.1.Java 8中是60 0135.2.2.Java 11中是65 5365.2.3.32位的Windows JVM,这个大小是10095.2.4.-XX:StringTableSize=N标志来设置5.2.4.1.默认值分别为1009、60 013或65 5365.2.5.哈希表包含一个数组5.2.5.1.该数组可以容纳一定数量的条目5.2.5.2.数组中的每个元素被称为一个桶5.2.5.3.当两个对象被映射到同一个桶时,称为碰撞(collision)5.3.jmap命令5.3.1.获得应用程序分配的保留字符串数量5.3.2.获得应用程序分配的保留字符串的总大小5.4.String.equals()方法是相当快的5.4.1.不等长的字符串永远不会相等5.4.2.字符串的长度相等,它会扫描字符串并比较所有的字符(直到发现有字符串不匹配)5.5.自定义字符串保留5.5.1.自定义映射的优势在于,它不需要事先设定大小,而可以根据需要自行调整大小5.5.2.GC压力才是真正的重6.字符串连接6.1.-XX:+OptimizeStringConcat标志来控制6.1.1.默认值为true6.1.2.在Java 11中,javac编译器会产生完全不同的字节码6.1.2.1.该字节码会调用JVM中的一个特殊方法来优化字符串连接6.2.JDK 8的优化在处理字符串和整数时效果很好6.2.1.但无法处理双精度浮点数(以及大多数其他类型的数据)6.2.1.1.Java11可以6.3.当你转到一个较新的版本时,不需要重新编译旧代码,因为字节码会是一样的6.3.1.用Java 8编译执行字符串连接的代码,然后用Java 11运行它,Java 11 JDK采用的优化会和Java 8的相同6.3.1.1.代码仍然会被优化,并且运行得相当快6.4.想用新的编译器编译出新的代码,以使用新的语言特性6.4.1.用Java 11重新编译该代码,字节码会使用新的优化,它可能会更快6.5.千万不要在循环中使用字符串连接,除非连接的字符串不会在循环的下一次迭代中使用6.5.1.否则,永远要显式地使用StringBuilder对象来获得更好的性能6.5.2.可以在(逻辑上的)单行中完成连接时,就不要害怕使用它

标签: #javaseapi