本文主要基于 Java performance tuning tips or everything you want to know about Java performance in 15 minutes的翻译。
这篇指南主要调优 java 代码而不是 JVM 设置。
一、JDK 类
Java 1.7.0_06 String 内部表示的改变
- 从 Java 1.7.0_06 开始,
String.substring
总是为它创建的新字符串创建一个新的底层char[]
值。这意味着这个方法现在有线性的复杂度,之前是常量的复杂度。这个改变的好处是字符串需要更少的内存 footprint(比以前少8字节),也是避免String.substring
导致的内存泄露的一个保证。
Java 里二进制序列化的不同方法
- 写单个字节到直接字节缓存是非常慢的。对写记录 — 大多数情况是单个字节的字段,你应该避免使用直接字节缓存。
- 如果你有原始数组字段,总是使用bulk方法来处理它们(一次处理一批的)。ByteBuffer 的bulk 方法的性能接近于Unsafe的这些方法。如果你需要存储/加载任何其它原始数组 – 除字节型的,用
ByteBuffer.to[YouType]Buffer.put(array)
方法调用,字节缓存的位置会自动更新。不要在循环里调用ByteBuffer.put[YouType]
方法。 - 总是尝试用带本地字节顺序的直接缓存序列化原始数组。直接字节缓存的性能接近于Unsafe且是可移植的。
Java 集合概览
单线程 | 并发 | |
Lists | ArrayList : 一般基于数组 LinkedList :不要使用 Vector:废弃 |
CopyOnWriteArrayList:很少更新,经常遍历。 |
Queues/deques | ArrayDeque:一般基于数组。 Stack:废弃。 PriorityQueue:有序的检索操作。 |
ArrayBlockQueue:有界阻塞queue。 ConcurrentLinkedDeque/ConcurrentLinkedQueue:无界链接queue(CAS)。 DelayQueue:在每个元素上带延迟的queue。 LinkedBlockingDeque/LinkedBlockingQueue:可选的有界链接queue(锁)。 LinkedTransferQueue:may transfer elements w/o storing。 PriorityBlockingQueue:并发的PriorityQueue。 SynchronousQueue:实现了Queue接口的Exchanger。 |
Maps | HashMap:一般的map。 EnumMap:enum作为key的。Hashtable:废弃。 IdentityHashMap:用 == 比较键。 LinkedHashMap:保留了插入顺序。 TreeMap:有序的键。 WeakHashMap:可用于缓存。 |
ConcurrentHashMap:一般的并发map。 ConcurrentSkipListMap:有序的并发map。 |
Sets | HashSet:一般的set。 EnumSet:enum的集合。 BitSet:比特位或稀疏整数的集合。 LinkedHashSet:保留了插入顺序。 TreeSet:有序集合。 |
ConcurrentSkipListSet:有序并发集合。 CopyOnWriteArraySet:很少更新,经常遍历。 |