我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 浅析Java语言慢的原因
总共48086条微博

动态微博

查看: 1447|回复: 0

浅析Java语言慢的原因

[复制链接]

13

主题

2

听众

115

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-07-07 15:02:33 |只看该作者 |倒序浏览
java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论。我想就我自己的理解,谈一下影响Java程序运行速度的因素。
6 E: |; m) Q/ O: T4 e
! {: a- [: h* w. K5 e& I1、 GC回收0 o: v3 S6 e" g" o5 w( ^
& g* `: T  g- T- b
众所周知,Java相对C/C++的一个很大进步就是有了GC机制,它能够很大程序的避免C/C++常见的内存泄漏的发生。但是这也是有代价的,那就是因为JVM管理了所有内存分配释放,当内存不够时就需要做回收,每次回收都有扫描整个堆,然后要搬移一些内存数据,新生代还好,如果是老年代的GC,会造成程序卡顿一段时间,很多时候是不能接受的,也极大的拖慢了程序的运行速度。虽然GC算法在不断改进,但是也属于只能优化不能根治。
! `3 u  n1 _8 K5 L( L; Y
4 @, p" f8 Q" q) \( f+ [8 d2、 解释性语言
9 T/ e# c  M& n  w: l: u! q& c" T8 w. N) _2 q; k  l
Java为了跨平台,没有直接编译成机器指令,而是编译成字节码,运行时JVM需要加载这些字节码,然后再逐条解释执行。这个过程中,字节码的加载需要时间,然后解释执行也需要时间。做同样一件事情,编译语言可以直接编译成机器码,运行时CPU就直接执行这些指令,而Java是编译成字节码,运行时JVM要把字节码翻译成目标机器的可执行指令,这里面就增加了一层间接性,所以也会降低运行速度。. q, p% e3 q1 y7 m3 R; N: L
1 W$ q5 D/ [& x  h' W% }5 c7 Z; o
3、 JIT消耗资源
8 L, P5 r+ ^" Q! s4 ]% H/ W4 _! V% D; g$ U  o
JIT是Java后续版本的改进功能,能把常执行的方法或者语句块即时编译成机器码,这样确实能加快运行速度。但是这种编译是即时发生,会和程序本身抢用运行资源,就会拖慢程序运行的速度。7 Y9 `* E" ?! n  H9 t
( ]  k' g& D2 j. n% V4 H
4、 基于栈的指令集
/ W" }0 U7 N  X1 I& X( Y% |! r  ]7 f6 y- ]% r' d
编译语言多采用基于目标平台寄存器的指令集,这样能充分利用寄存器的高速度。Java为了可移植性,没有绑定某个目标平台的寄存器,而是采用基于栈的指令集。频繁的栈内存访问会导致比较慢的速度,并且通常编译相同语句产生的指令数量也要多于寄存器指令集。
. \/ j* B, A( }+ d& M- t' d; X9 z* H
5、 大量使用堆内存
& z% P9 g6 b% ?$ Z$ w) {" Q5 R) X2 `
$ D1 j; e% I  U( E& ]' zJava中对象创建被JVM托管,能够避免越界或空指针访问之类在C/C++中常见的问题。因此对象大多是创建在堆上的,而不是栈上的,其创建和维护成本上通常要更高一些。
! v2 i& R" s: C; J' S
; q$ c1 l+ ]  H" }" A6、 AOT技术) ]: [9 U& y  o: A+ {

* r+ K& U+ q6 k1 N, jAOT技术能够在字节码安装到目标平台时,先编译成目标平台的执行文件,这样目标平台就可以直接运行可执行文件,速度上可以达到编译类语言的水平。但是这样会导致Java所拥有的动态加载功能丧失,所有字节码都被编译到执行文件,不论其在运行时是否被使用到,并造成其产生的可执行文件相对于字节码来说体积更大。5 j/ e& `- \& ]$ |* ~* Z

+ d* E# U6 Z" f7 T# [总言而之,Java由于其跨平台且管理内存等特性,给开发效率带来了诸多进步,但是凡事有利也有弊,伴随而来的是运行效率的降低。充分了解这些优势和劣势,才能在合适的时候选择合适的技术,以发挥最大的效能。/ ^' D  s2 Y& J1 v
4 S+ \! f+ J4 u' Q; P: X: E
(完)

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表