`
jacky2007
  • 浏览: 169487 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]多核平台下的JAVA优化

    博客分类:
  • JAVA
 
阅读更多

转自:http://www.yankay.com/%E5%A4%9A%E6%A0%B8%E5%B9%B3%E5%8F%B0%E4%B8%8B%E7%9A%84java%E4%BC%98%E5%8C%96/

 

现在多核CPU是主流。利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集。但是Java利用多核技术也 带来了一些问题,主要是多线程共享内存引起了。目前内存和CPU之间的带宽是一个主要瓶颈,每个核可以独享一部分高速缓存,可以提高性能。JVM是利用操 作系统的"轻量级进程"实现线程,所以线程每操作一次共享内存,都无法在高速缓存中命中,是一次开销较大的系统调用。所以区别于普通的优化,针对多核平 台,需要进行一些特殊的优化。

代码优化

线程数要大于等于核数

如果使用多线程,只有运行的线程数比核数大,才有可能榨干CPU资源,否则会有若干核闲置。要注意的是,如果线程数目太多,就会占用过多内存,导致性能不升反降。JVM的垃圾回收也是需要线程的,所以这里的线程数包含JVM自己的线程

尽量减少共享数据写操作

每个线程有自己的工作内存,在这个区域内,系统可以毫无顾忌的优化,如果去读共享内存区域,性能也不会下降。但是一旦线程想写共享内存(使用 volatile关键字),就会插入很多内存屏障操作(Memory Barrier或者Memory Fence)指令,保证处理器不乱序执行。相比写本地线程自有的变量,性能下降很多。处理方法是尽量减少共享数据,这样也符合"数据耦合"的设计原则。

使用synchronize关键字

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

使用乐观策略

传统的同步并发策略是悲观的。表现语义为:多线程操作一个对象的时候,总觉得会有两个线程在同时操作,所以需要锁起来。乐观策略是,假设平时就一个线程访问,当出现了冲突的时候,再重试。这样更高效一些。Java的AtomicInteger就是使用了这个策略。

使用线程本地变量(ThreadLocal)

使用ThreadLocal可以生成线程本地对象的副本,不会和其他线程共享。当该线程终止的时候,其本地变量可以全部回收。

类中Field的排序

可以将一个类会频繁访问到的几个field放在一起,这样他们就有更多的可能性被一起加入高速缓存。同时最好把他们放在头部。基本变量和引用变量不要交错排放。

批量处理数组

现在处理器可以用一条指令来处理一个数组中的多条记录,例如可以同时向一个byte数组中读或者写store记录。所以要尽量使用System.arraycopy()这样的批量接口,而不是自己操作数组。

JVM优化

启用大内存页

现在一个操作系统默认页是4K。如果你的heap是4GB,就意味着要执行1024*1024次分配操作。所以最好能把页调大。这个配额设计操作系统,单改Jvm是不行的。Linux上的配置有点复杂,不详述。

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

启用压缩指针

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

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

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

benchmarka

启用NUMA

numa是一个CPU的特性。SMP架构下,CPU的核是对称,但是他们共享一条系统总线。所以CPU多了,总线就会成为瓶颈。在NUMA架构下,若干CPU组成一个组,组之间有点对点的通讯,相互独立。启动它可以提高性能。

NUMA需要硬件,操作系统,JVM同时启用,才能启用。Linux可以用numactl 来配置numa,JVM通过-XX:+UseNUMA来启用。

激进优化特性

在Java1.6中,激进优化(AggressiveOpts)是默认开启的。激进优化是一般有一些下一个版本才会发布的优化选项。但是有可能造成不稳定。前段时间以讹传讹的JDK7的Bug ,就是开启这个选项后测到的。

逃逸分析

让一个对象在一个方法内创建后,如果他传递出去,就可以称为方法逃逸;如果传递到别的线程,成为线程逃逸。如果能知道一个对象没有逃逸,就可以把它 分配在栈而不是堆上,节约GC的时间。同时可以将这个对象拆散,直接使用其成员变量,有利于利用高速缓存。如果一个对象没有线程逃逸,就可以取消其中一切 同步操作,很大的提高性能。

但是逃逸分析是很有难度的,因为花了cpu去对一个对象去分析,要是他不逃逸,就无法优化,之前的分析血本无归。所以不能使用复杂的算法,同时现在的JVM也没有实现栈上分配。所以开启之后,性能也可能下降。

可以使用-XX:+DoEscapeAnalysis来开启逃逸分析。

高吞吐量GC配置

对于高吞吐量,在年轻态可以使用Parallel Scavenge,年老态可以使用Parallel Old垃圾收集器。
使用-XX:+UseParallelOldGC开启

可以将-XX:ParallelGCThreads根据CPU的个数进行调整。可以是CPU数的1/2或者5/8

低延迟GC配置

对于低延迟的应用,在年轻态可以使用ParNew,年老态可以使用CMS垃圾收集器。

可以使用-XX:+UseConcMarkSweepGC和-XX:+UseParNewGC打开。

可以将-XX:ParallelGCThreads根据CPU的个数进行调整。可以是CPU数的1/2或者5/8

可以调整-XX:MaxTenuringThreshold(晋升年老代年龄)调高,默认是15.这样可以减少年老代GC的压力

可以-XX:TargetSurvivorRatio,调整Survivor的占用比率。默认50%.调高可以提供Survivor区的利用率

可以调整-XX:SurvivorRatio,调整Eden和Survivor的比重。默认是8。这个比重越小,Survivor越大,对象可以在年轻态呆更多时间。

分享到:
评论

相关推荐

    多核多线程下java设计模式性能提升.pdf

    总结来说,本文档通过介绍单例模式在多核多线程环境下的性能提升方法,探讨了Java设计模式在现代大型系统应用中的优化策略,并对JDK未来的设计模式实现提出期望,为Java开发人员提供了宝贵的技术指导和参考。

    多核多线程下java设计模式性能提升.zip

    在现代计算机系统中,多核处理器已经成为主流,Java作为一款广泛应用的编程语言,其在多核多线程环境下的性能优化至关重要。Java设计模式在这样的背景下扮演着关键角色,能够帮助开发者有效地利用多核资源,提升软件...

    精通lambda表达式:Java多核编程

    8. **性能优化技巧**:理解并合理使用`(parallelismLevel)`参数来控制并行度,以及避免数据竞争和不必要的同步,可以显著提高多核环境下的程序性能。 9. **实战示例**:书中可能包含了大量的实战示例,如大数据处理...

    Intel多核培训3.rarIntel多核培训3.rarIntel多核培训3

    【Intel多核培训3】是针对Intel多核处理器技术的一系列教育资源,主要由清华大学提供。...通过学习,读者可以深入了解多核环境下的系统行为,掌握并行编程和性能优化的技能,为开发更高性能的应用程序奠定坚实基础。

    浅析多核处理器条件下的Java编程.pdf

    《浅析多核处理器条件下的Java编程》这篇文章探讨了如何利用Java语言的多线程特性在多核处理器环境下实现高效编程。多核处理器是现代计算机硬件的重要组成部分,它通过集成多个处理器核心,允许同时处理多个任务,...

    多核编程之挑战与应对

    如果不针对多核进行优化,软件可能无法充分利用多核的优势,甚至可能在某些情况下表现得不如单核处理器。其次,不同领域的软件对多核的适应性不同。例如,科学计算软件通常已具备并行化能力,服务器应用由于其并发...

    4本高清中文版Java性能优化经典书籍

    Java性能优化是IT行业中至关重要的一个领域,尤其是在大型企业级应用和互联网服务中,高效的Java代码能够显著提升系统运行效率,降低服务器资源消耗。以下是对这四本经典书籍中的核心知识点的详细介绍: 1. **...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...

    JAVA性能优化.docJAVA性能优化.doc

    【JAVA性能优化】 Java性能优化是提升Java应用程序效率的关键步骤,尤其对于大型系统或服务器端应用,优化可以显著改善程序的响应时间和资源消耗。本文将从三个方面探讨Java性能优化:虚拟机选择与优化、应用程序...

    Java程序性能优化 让你的Java程序更快、更稳定

    Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...

    Java性能优化比较

    并发优化是现代多核处理器环境下不可或缺的部分。Java提供了多种并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,用于高效地管理和调度线程。理解锁的概念,包括内置锁(synchronized)、显式锁(Lock...

    精通lambda表达式: java多核编程

    《精通Lambda表达式:Java多核编程》这本书深入探讨了Java编程中的一种重要特性——Lambda表达式,以及如何在多核环境下充分利用这一特性提高程序性能。Lambda表达式是Java 8引入的关键特性之一,它极大地简化了函数...

    Java 性能优化 一书源码

    Java性能优化是软件开发中的一个关键领域,尤其是在大型企业级应用和高并发系统中。《Java性能优化》一书深入探讨了如何通过各种技术提升Java应用程序的效率和响应速度。以下是一些基于书籍源码和相关文件名的关键...

    5-1-Java-Performance

    ### Java虚拟机(JVM)在多核平台上的调优 #### 概述 随着现代计算技术的发展,多核处理器已成为主流。多核架构为应用程序提供了前所未有的并行处理能力,从而提高了性能。然而,要充分利用这些多核处理器的能力,就...

    java程序优化的一些最佳实践

    Java程序优化的最佳实践涉及到多个方面,包括性能提升、代码可读性和可扩展性的增强。优化过程中,首先要明确衡量程序质量的标准,例如时间复杂度、空间复杂度、可读性和可扩展性。对于现代计算机系统,时间复杂度...

    java性能优化

    在Java性能优化领域,开发者需要深入理解如何最大化利用系统资源,提升应用的运行效率和响应速度,同时确保系统的稳定性和可扩展性。本书"java性能优化"针对的就是这部分内容,旨在帮助Java程序员提升他们的技术水平...

    Java性能优化实战视频全集

    ### Java性能优化实战知识点概述 #### 一、理论分析篇 **1.1 性能优化的衡量指标及注意事项** - **衡量指标**: 包括响应时间、吞吐量、资源利用率等。 - **注意事项**: 在进行性能优化时,需确保优化方案不会引入...

    多核软件开发技术 北京大学

    课件:(1)多核技术导论 (2)并行计算基础 (3)网络编程技术 (4)Windows多线程编程及调优 (5)Linux多线程编程及调优 (6)OpenMP多线程编程及性能优化 (7)MPI编程及性能优化 (8)多核软件工具介绍 实验一:...

Global site tag (gtag.js) - Google Analytics