java

位置:IT落伍者 >> java >> 浏览文章

Java 6中的性能优化


发布日期:2020年02月08日
 
Java 6中的性能优化

JSE (代号Mustang野马)主要设计原则之一就是提升JSE的性能和扩展能力主要通过最大程度提升运行效率更好的垃圾收集和一些客户端性能来达到

偏向锁(Biased locking)

Java 以前加锁操作都会导致一次原子CAS(CompareAndSet)操作CAS操作是比较耗时的即使这个锁上实际上没有沖突只被一个线程拥有也会带来较大开销为解决这一问题Java 中引入偏向锁技术即一个锁偏向于第一个加锁的线程该线程后续加锁操作不需要同步大概的实现如下一个锁最初为NEUTRAL状态当第一个线程加锁时将该锁的状态修改为BIASED并记录线程ID当这一线程进行后续加锁操作时若发现状态是BIASED并且线程ID是当前线程ID则只设置一下加锁标志不需要进行CAS操作其它线程若要加这个锁需要使用CAS操作将状态替换为REVOKE并等待加锁标志清零以后该锁的状态就变成 DEFAULT常用旧的算法处理这一功能可用XXUseBiasedLocking命令禁止

锁粗化(Lock coarsening)

如果一段代码经常性的加锁和解锁在解锁与下次加锁之间又没干什么事情则可以将多次加加锁解锁操作合并成一对这一功能可用XXEliminateLocks禁止

自适应自旋(Adaptive spinning)

一般在多CPU的机器上加锁实现都会包含一个短期的自旋过程自旋的次数不太好决定自旋少了会导致线程被挂起和上下文切换增加自旋多了耗CPU为此Java 中引入自适应自旋技术即根据一个锁最近自旋加锁成功概率动态调整自旋次数

常用大内存分布的堆(large page heap)

在大内分页是x/amd架构上用来减小TLB(虚拟地址到物理地址翻译缓存)大小的TLB失配率Java 中的内存堆可以使用这一技术

提高数组拷贝性能

对每种类型大小写一个定制的汇编数组拷贝程序

后台进行代码优化

Background Compilation in HotSpot&#; Client Compiler 后台进行代码优化

线性扫描寄存器分配算法(Linear Scan Register Allocation)

一种新的寄存器分配策略基于SSA(static single assignment)性能提高%左右常用的寄存器分配算法将寄存器分配看作图着色问题时间复杂度是O(n^不适用于Java的JIT编译原来的JVM里是根据一些本地启发式规则来分配寄存器效果不太好Java 中使用的线性扫描寄存器算法能够达到与图颜色算法相似的效果并且时间复杂度是线性的

并行缩并垃圾收集器(Parallel Compaction Collector)

进行Full GC时使用并行垃圾收集(JDK 里原来非Full GC是并行的但Full GC是串行的)使用XX+UseParallelOldGC开启这一功能

并行低停顿垃圾收集器(Concurrent Low Pause Collector)

显式调用gc(如Systemgc)时也可以并行进行标记清扫式垃圾收集使用XX+ExplicitGCInvokesConcurrent开启

Ergonomics in the Java Virtual Machine

自动调整垃圾收集策略堆大小等配置这一功能在JDK 中加入JDK 中得到显着增强SPECjbb性能提高%

boot类装载器的优化

jre中增加一个描述package所在jar文件的元索引文件加快classloader加载类性能提高桌面Java应用启动速度(+%)内存占用也减少了%

图形程序优化

在jvm启动之前显示splash

Swing程序中每个窗口有一个后台显示缓存当该窗口原来被遮挡现在要显示时直接从该缓存拷贝数据进行渲染即使该窗口的绘制线程被阻塞也可以完成这一渲染

上一篇:对Java提供的两个Map进行的性能测试

下一篇:struts中一些常用包的详解