java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论。我想就我自己的理解,谈一下影响Java程序运行速度的因素。 ( F6 D. h( S' v% W A. h" x9 L" s1 l0 P( D( K0 k
1、 GC回收7 e6 G6 M2 @, ^% w! ^4 f
; I' G# J( h; n众所周知,Java相对C/C++的一个很大进步就是有了GC机制,它能够很大程序的避免C/C++常见的内存泄漏的发生。但是这也是有代价的,那就是因为JVM管理了所有内存分配释放,当内存不够时就需要做回收,每次回收都有扫描整个堆,然后要搬移一些内存数据,新生代还好,如果是老年代的GC,会造成程序卡顿一段时间,很多时候是不能接受的,也极大的拖慢了程序的运行速度。虽然GC算法在不断改进,但是也属于只能优化不能根治。 0 D! ?0 Y C8 W9 ^: v: v S# q0 r- ]0 C1 B' V! ?2、 解释性语言 ; K0 Y' t. |& o : F7 T+ h; A: `0 V- U8 @- q, _( LJava为了跨平台,没有直接编译成机器指令,而是编译成字节码,运行时JVM需要加载这些字节码,然后再逐条解释执行。这个过程中,字节码的加载需要时间,然后解释执行也需要时间。做同样一件事情,编译语言可以直接编译成机器码,运行时CPU就直接执行这些指令,而Java是编译成字节码,运行时JVM要把字节码翻译成目标机器的可执行指令,这里面就增加了一层间接性,所以也会降低运行速度。1 R* U/ N$ D% N' T& r( h6 J
+ q1 S R6 S0 v
3、 JIT消耗资源 4 v: `; L# B- g& V; u9 | 1 b% i: W4 Y( b1 h. K: {: j; aJIT是Java后续版本的改进功能,能把常执行的方法或者语句块即时编译成机器码,这样确实能加快运行速度。但是这种编译是即时发生,会和程序本身抢用运行资源,就会拖慢程序运行的速度。8 ]! ^+ J/ I9 n7 V. F: }
8 b, `0 x7 p7 [4、 基于栈的指令集* R& P. u5 V3 M3 S( B
% \3 d1 c6 X( Y* ^) N' v# o
编译语言多采用基于目标平台寄存器的指令集,这样能充分利用寄存器的高速度。Java为了可移植性,没有绑定某个目标平台的寄存器,而是采用基于栈的指令集。频繁的栈内存访问会导致比较慢的速度,并且通常编译相同语句产生的指令数量也要多于寄存器指令集。" p, A5 O! J! x4 i- R( Q& y
. `' W6 C7 S" ~( L% e" T
5、 大量使用堆内存8 o; N5 w' L5 n) y" b. ^/ y