草庐IT

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

躺柒 2023-03-28 原文

1. 压缩字符串

1.1. Java 6

1.2. 实验性

1.3. compressed string

2. 字符串

2.1. Java 8

2.2. 所有都会编码为16位字符数组

3. 紧凑字符串

3.1. Java 11

3.2. compact string

3.3. 8位字节数组

3.3.1. 节约大量内存

3.4. -XX:+CompactStrings标志控制的

3.4.1. 默认是true

3.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. 默认是false

4.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. 默认值是3

4.2. String类的intern()方法来创建字符串的标准化版本

4.3. 自定义方法来创建字符串的标准化版本

5. 字符串保留

5.1. 使用String类的intern()方法

5.1.1. 查看字符串表的执行情况

5.1.1.1. -XX:+PrintStringTableStatistics标志运行你的应用程序

5.1.1.2. 默认是false

5.1.2. 只有当应用程序在一组相同长度的字符串上进行大量的重复比较时,才可以预期字符串比较能从intern()方法的使用中受益

5.1.3. intern()方法的性能是由字符串所在哈希表大小的优化程度主导的

5.2. 原生哈希表有固定的大小

5.2.1. Java 8中是60 013

5.2.2. Java 11中是65 536

5.2.3. 32位的Windows JVM,这个大小是1009

5.2.4. -XX:StringTableSize=N标志来设置

5.2.4.1. 默认值分别为1009、60 013或65 536

5.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. 默认值为true

6.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. 可以在(逻辑上的)单行中完成连接时,就不要害怕使用它

有关读Java性能权威指南(第2版)笔记02_ Java SE API技巧上的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐