多核平台下的Java优化

  • 时间:
  • 浏览:0

  使用程序运行本地变量(ThreadLocal)

  使用 ThreadLocal 还时要生成程序运行本地对象的副本,不想和某些程序运行共享。当该程序运行终止的却说 ,其本地变量还时要完整版回收。

  在 Java1.5 中,synchronize 是性能低效的。因此这是一俩个 多重量级操作,时要调用操作接口,导致 有因此加锁消耗的系统时间比加锁以外的操作还多。相比之下使用 Java 提供的 Lock 对象,性能更高某些。因此到了 Java1.6,居于了变化。synchronize 在语义上很清晰,还时要进行太少太少太少太少有优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致 在 Java1.6 上 synchronize 的性能暂且比 Lock 差。官方也表示,亲戚亲戚让让我们都都 也更支持 synchronize,在未来的版本中还有优化余地。

现在多核 CPU 是主流。利用多核技术,还时要有效发挥硬件的能力,提升吞吐量,对于 Java 程序运行,还时要实现并发垃圾埋点。因此 Java 利用多核技术也带来了某些问提,主却说 程序运行共享内存引起了。目前内存和 CPU 之间的速率单位单位是一俩个 多主要瓶颈,每个核还时要独享一每种高速缓存,还时要提高性能。JVM 是利用操作系统的”轻量级程序运行”实现程序运行,太少太少太少太少有程序运行每操作一次共享内存,都无法在高速缓存中命中,是一次开销较大的系统调用。太少太少太少太少有区别于普通的优化,针对多核平台,时要进行某些特殊的优化。

  现在一俩个 多操作系统默认页是4K。因此你的 heap 是4GB,就导致 要执行1024*1024次分配操作。太少太少太少太少有最好能把页调大。你你是什么配额设计操作系统,单改 Jvm 是不行的。Linux 上的配置有点复杂化,不详述。

  每个程序运行有本人的工作内存,在你你是什么区域内,系统还时要毫无顾忌的优化,因此去读共享内存区域,性能却说 会下降。因此一旦程序运行想写共享内存(使用 volatile 关键字),就会插入太少太少太少太少有内存屏障操作(Memory Barrier 因此 Memory Fence)指令,保证补救器不乱序执行。相比写本地程序运行自有的变量,性能下降太少太少太少太少有。补救最好的法律法律依据 是尽量减少共享数据,却说 也符合”数据耦合”的设计原则。

  还时要将一俩个 多类会频繁访问到的有几个 field 倒入一起去,却说 亲戚亲戚让让我们都都 也有更多的因此性被一起去加入高速缓存。一起去最好把亲戚亲戚让让我们都都 倒入头部。基本变量和引用变量暂且交错排放。

  类中 Field 的排序

  在 JDK6 update 23 默认开启了,却说 的版本还时要使用-XX:+UseCompressedOops 来启动配置。

  因此使用程序运行,只有运行的程序运行数比核数大,才有因此榨干 CPU 资源,因此会有若干核闲置。要注意的是,因此程序运行数目太少,就会占用太少内存,导致 性能不升反降。JVM 的垃圾回收也是时要程序运行的,太少太少太少太少有这里的程序运行数富含 JVM 本人的程序运行

  现在补救器还时要用第第一根 指令来补救一俩个 多数组中的多条记录,之类还时要一起去向一俩个 多 byte 数组中读因此写 store 记录。太少太少太少太少有要尽量使用 System.arraycopy ()却说 的批量接口,而也有本人操作数组。

  启用压缩指针

  使用 synchronize 关键字

  性能还时要看你你是什么评测,性能的提升是很可观。

  传统的同步并发策略是悲观的。表现语义为:程序运行操作一俩个 多对象的却说 ,总虽然会一俩个 多程序运行在一起去操作,太少太少太少太少有时要锁起来。乐观策略是,假设平时就一俩个 程序运行访问,当突然出現了冲突的却说 ,再重试。却说 更高效某些。Java 的 AtomicInteger 却说 使用了你你是什么策略。

  批量补救数组

  代码优化

  使用乐观策略

  尽量减少共享数据写操作

  Java 的64的性能比32慢,导致 是因此其指针由32位扩展到64位,虽然寻址空间从4GB 扩大到 256 TB,但导致 性能的下降,并占用了更多的内存。太少太少太少太少有对指针进行压缩。压缩后的指针最多支持32GB 内存,因此还时要获得32位 JVM 的性能。

  启用大内存页

  JVM 优化

  程序运行数要大于等于核数

  在 Java1.6 中 UseLargePages 是默认开启的,LasrgePageSzieInBytes 被设置成了4M。笔者看多某些情况汇报下配置成了128MB,在官方的性能测试中更是配置到256MB。