pull/1/head
595208882@qq.com 3 years ago
parent f66a4b03bf
commit c702a1f641

@ -1571,7 +1571,7 @@ CopyOnWriteArrayList相当于线程安全的ArrayList它实现了List接口
### HashSet(Hash表)
**HashSet 基于 HashMap底层是通过 HashMap 的API来实现的。**哈希表边存放的是哈希值。HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值如果哈希值一样接着会比较equals方法如果 equls 结果为 true HashSet 就视为同一个元素;如果 equals 为 false 就不是同一个元素。hashcode相同equals不相等则使用链表存储。
**HashSet 基于 HashMap底层是通过 HashMap 的API来实现的。**哈希表边存放的是哈希值。HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值如果哈希值一样接着会比较equals方法如果 equals 结果为 true HashSet 就视为同一个元素;如果 equals 为 false 就不是同一个元素。hashcode相同equals不相等则使用链表存储。

@ -1011,7 +1011,7 @@ Parallel Old 收集器是 Parallel Scavenge 的老年代版本,追求 CPU 吞
- **并发失败Concurrent Mode Failure**
由于在垃圾回收阶段用户线程还在并发运行那就还需要预留足够的内存空间提供给用户线程使用因此CMS不能像其他回收器那样等到老年代几乎完全被填满了再进行回收必须预留一部分空间供并发回收时的程序运行使用。默认情况下当老年代使用了 92% 的空间后就会触发 CMS 垃圾回收,这个值可以通过 -XX**:** CMSInitiatingOccupancyFraction 参数来设置。
由于在垃圾回收阶段用户线程还在并发运行那就还需要预留足够的内存空间提供给用户线程使用因此CMS不能像其他回收器那样等到老年代几乎完全被填满了再进行回收必须预留一部分空间供并发回收时的程序运行使用。默认情况下当老年代使用了 80% 的空间后就会触发 CMS 垃圾回收,这个值可以通过 -XX**:** CMSInitiatingOccupancyFraction 参数来设置。
这里会有一个风险要是CMS运行期间预留的内存无法满足程序分配新对象的需要就会出现一次“并发失败”Concurrent Mode Failure这时候虚拟机将不得不启动后备预案Stop The World临时启用 Serial Old 来重新进行老年代的垃圾回收,这样一来停顿时间就很长了。

Loading…
Cancel
Save