多核平台下的Java优化

  • 时间:
  • 浏览:0

  使用 ThreadLocal 能只能生成线程运行本地对象的副本,后该和你这个 线程运行共享。当该线程运行终止的以后,其本地变量能只能详细回收。

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

  可能使用线程运行,只能运行的线程运行数比核数大,才有可能榨干 CPU 资源,以后会有若干核闲置。要注意的是,可能线程运行数目太少,就会占用太少内存,原应性能不升反降。JVM 的垃圾回收也是只能线程运行的,好多好多 这里的线程运行数中含 JVM 另一方的线程运行

  在 JDK6 update 23 默认开启了,以后的版本能只能使用-XX:+UseCompressedOops 来启动配置。

  启用压缩指针

  在 Java1.5 中,synchronize 是性能低效的。可能这是一一个重量级操作,只能调用操作接口,原应有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用 Java 提供的 Lock 对象,性能更高你这个 。以后到了 Java1.6,处于了变化。synchronize 在语义上很清晰,能只能进行好多好多 优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。原应在 Java1.6 上 synchronize 的性能何必 比 Lock 差。官方也表示,让让我们都都也更支持 synchronize,在未来的版本中还有优化余地。

  类中 Field 的排序

  Java 的64的性能比32慢,原应是可能其指针由32位扩展到64位,确实寻址空间从4GB 扩大到 256 TB,但原应性能的下降,并占用了更多的内存。好多好多 对指针进行压缩。压缩后的指针最多支持32GB 内存,以可以只能获得32位 JVM 的性能。

  能只能将一一个类会频繁访问到的有几个 field 贴到 去一起去,以后让让我们都都详细都有更多的可能被一起去加入高速缓存。一起去最好把让让我们都都贴到 去头部。基本变量和引用变量何必 交错排放。

  代码优化

  传统的同步并发策略是悲观的。表现语义为:线程运行操作一一个对象的以后,总确实会有一一个线程运行在一起去操作,好多好多 只能锁起来。乐观策略是,假设平时就一一个线程运行访问,当经常出现了冲突的以后,再重试。以后更高效你这个 。Java 的 AtomicInteger 好多好多 使用了你这个 策略。

  JVM 优化

  在 Java1.6 中 UseLargePages 是默认开启的,LasrgePageSzieInBytes 被设置成了4M。笔者看过你这个 状况下配置成了128MB,在官方的性能测试中更是配置到256MB。

现在多核 CPU 是主流。利用多核技术,能只能有效发挥硬件的能力,提升吞吐量,对于 Java 线程运行,能只能实现并发垃圾整理。以后 Java 利用多核技术也带来了你这个 问提,主好多好多 线程运行共享内存引起了。目前内存和 CPU 之间的下行速度 是一一个主要瓶颈,每个核能只能独享一累积高速缓存,能只能提高性能。JVM 是利用操作系统的”轻量级线程运行运行”实现线程运行,好多好多 线程运行每操作一次共享内存,都无法在高速缓存中命中,是一次开销较大的系统调用。好多好多 区别于普通的优化,针对多核平台,只能进行你这个 特殊的优化。

  现在一一个操作系统默认页是4K。可能你的 heap 是4GB,就原应分析要执行1024*1024次分配操作。好多好多 最好能把页调大。你这个 配额设计操作系统,单改 Jvm 是不行的。Linux 上的配置很重错综复杂,不详述。

  性能只能只能看你这个 评测,性能的提升是很可观。

  尽量减少共享数据写操作

  现在补救器能只能用一根指令来补救一一个数组中的多条记录,类式能只能一起去向一一个 byte 数组中读可能写 store 记录。好多好多 要尽量使用 System.arraycopy ()以后的批量接口,而详细都有另一方操作数组。

  使用乐观策略

  启用大内存页

  批量补救数组

  每个线程运行有另一方的工作内存,在你这个 区域内,系统能只能毫无顾忌的优化,可能去读共享内存区域,性能好多好多 会下降。以后一旦线程运行想写共享内存(使用 volatile 关键字),就会插入好多好多 内存屏障操作(Memory Barrier 可能 Memory Fence)指令,保证补救器不乱序执行。相比写本地线程运行自有的变量,性能下降好多好多 。补救妙招是尽量减少共享数据,以后也符合”数据耦合”的设计原则。

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

  使用 synchronize 关键字