浅析Java语言慢的原因
Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论。我想就我自己的理解,谈一下影响Java程序运行速度的因素。
1、GC回收
众所周知,Java相对C/C++的一个很大进步就是有了GC机制,它能够很大程序的避免C/C++常见的内存泄漏的发生。但是这也是有代价的,那就是因为JVM管理了所有内存分配释放,当内存不够时就需要做回收,每次回收都有扫描整个堆,然后要搬移一些内存数据,新生代还好,如果是老年代的GC,会造成程序卡顿一段时间,很多时候是不能接受的,也极大的拖慢了程序的运行速度。虽然GC算法在不断改进,但是也属于只能优化不能根治。
2、解释性语言
Java为了跨平台,没有直接编译成机器指令,而是编译成字节码,运行时JVM需要加载这些字节码,然后再逐条解释执行。这个过程中,字节码的加载需要时间,然后解释执行也需要时间。做同样一件事情,编译语言可以直接编译成机器码,运行时CPU就直接执行这些指令,而Java是编译成字节码,运行时JVM要把字节码翻译成目标机器的可执行指令,这里面就增加了一层间接性,所以也会降低运行速度。
3、JIT消耗资源
JIT是Java后续版本的改进功能,能把常执行的方法或者语句块即时编译成机器码,这样确实能加快运行速度。但是这种编译是即时发生,会和程序本身抢用运行资源,就会拖慢程序运行的速度。
4、基于栈的指令集
编译语言多采用基于目标平台寄存器的指令集,这样能充分利用寄存器的高速度。Java为了可移植性,没有绑定某个目标平台的寄存器,而是采用基于栈的指令集。频繁的栈内存访问会导致比较慢的速度,并且通常编译相同语句产生的指令数量也要多于寄存器指令集。
5、大量使用堆内存
Java中对象创建被JVM托管,能够避免越界或空指针访问之类在C/C++中常见的问题。因此对象大多是创建在堆上的,而不是栈上的,其创建和维护成本上通常要更高一些。
6、AOT技术
AOT技术能够在字节码安装到目标平台时,先编译成目标平台的执行文件,这样目标平台就可以直接运行可执行文件,速度上可以达到编译类语言的水平。但是这样会导致Java所拥有的动态加载功能丧失,所有字节码都被编译到执行文件,不论其在运行时是否被使用到,并造成其产生的可执行文件相对于字节码来说体积更大。
总言而之,Java由于其跨平台且管理内存等特性,给开发效率带来了诸多进步,但是凡事有利也有弊,伴随而来的是运行效率的降低。充分了解这些优势和劣势,才能在合适的时候选择合适的技术,以发挥最大的效能。
浅析Java语言慢的原因的更多相关文章
- 浅析Java语言中两种异常的差别
Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而 ...
- [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
Java Virtual Machine 官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 【转】浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- 用Java语言编写一个简易画板
讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...
- 瘋耔java语言笔记
一◐ java概述 1.1 ...
- Java语言的个人理解
Java语言的个人理解(比价深层次吧) 大四的生活确实十分的奢靡,不锻炼,不读书,几乎就是当一天和尚撞一天钟的生活,太颓废了,还好自己不是这个样子,不过身体确实差了很多,昨天跑了一圈内环(4KM),今 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
随机推荐
- OD 实验(三) - 破解程序的文件验证
需要破解的程序 双击程序,提示需要许可证文件 逆向程序 用 OD 打开 LoadIconA 为加载图标 LoadCursorA 为加载鼠标 F8 走一下程序 走到了这里,调用了 CreateFileA ...
- 100.64.0.0/10运营商级(Carrier-grade)NAT保留IP地址
在一次跟踪路由的网络操作时发现自己路由器下一跳路由节点的IP地址比较奇怪,是100.64.0.1.好奇促使我查询了这个IP地址的归属,结果是保留地址,到这里觉得比较奇怪了,按照常理以IPv4为例保留的 ...
- pycharm多行代码缩进、左移
在使用pycharm时,经常会需要多行代码同时缩进.左移,pycharm提供了快捷方式 1.pycharm使多行代码同时缩进 鼠标选中多行代码后,按下Tab键,一次缩进四个字符 2.pycharm使多 ...
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
- leetcode451
public class Solution { public string FrequencySort(string s) { var dic = new Dictionary<char, in ...
- 11.redis连接
转自:http://www.runoob.com/redis/redis-tutorial.html Redis 客户端连接 Redis 通过监听一个 TCP 端口或者 Unix socket 的方式 ...
- 重写iframe内联框架中的内容
重写iframe内联框架中的内容,不使用src指向页面url,主动写入HTML代码: var ifr = document.getElementById("CMBC-certificatio ...
- Oracle11gr2_ADG管理之switchover补充
之前演示的switchver总是提示下面的错误,并且需要人工干预: Oracle11gr2_ADG管理之switchover实战 DGMGRL> switchover to snewtest; ...
- 黑暗之光 Day2
1. 鼠标点击UI检测 UICamera.isOverUI 2. 鼠标指针管理 public class CussorManager : MonoBehaviour { public static C ...
- 关于Excel无法打开,因为文件格式或文件扩展名无效的解决方法
可能有网友也遇到过跟我一样的情况,新建的excel一打开就弹出 这样的错误. 这是因为excel打开的时候会去指定的文件夹找一个模板,以这个模板的样式打开新建的ecxel.所以如果excel打开的时候 ...