细数那些我们都习惯了的Java谣言
我是一个Java的反对者,至于为什么,我想最大的一个原因是它不实在,不管是当年sun所说的一些言论,还是如今Java用户的一些言论,都有蛊惑之嫌,甚至很多太假了,而这些言论层出不穷,其实就语言本身我不想说什么,任何语言存在都有它的道理,而且都有适合它的应用场景,但是如果总是夸大实在让人不爽
一、Java是简单的
Java简单吗,反正我不觉得,当然这是Java刚问世时说的,在当时看来还勉强说的过去,不过这句话至今仍在被引用,而且总是在和C++对比,不能说比C++简单就叫简单吧,难道会有人认为有比C++还复杂的语言?这样的对比显然是有问题的
二、一次编译到处运行
这句话应该有个前提,就是只要那个平台上有JVM,不过我不想咬文嚼字找漏洞,这样也没什么说服力,我认为这算不上什么优点,首先对于脚本语言而言,一次编写(不需要编译)就到处运行,岂不是更有优势,然而没有哪个脚本语言拿这个出来说事儿,为什么Java总是拿这个说事儿,况且一次编译到处调试这句话也不是空穴来风。还有经常会拿它的字节码来说事,仿佛只有java有中间吗一样,实际上解释型语言几乎都有中间码,这就是解释型语言的特点,这个特点在没有Java之前就有。让Java说的好像是它创造的一样,别的语言都是模仿它
三、JIT优化技术可以使Java的运行速度接近C/C++,甚至有些场景下会超越
Java的性能一直是Java开发者心中的痛,无论是当年的sun还是现在的oracle,几乎每一次的版本更新都会着重说明性能有很大的提升,而且每一次都像一颗定心丸一样安慰这它的用户,使大家对Java的性能有信心。不过从Java诞生起,提升了这么多年,提升了多少呢,不管提升了多少,客户端(除了andriod)用Java的太少了,就算是不是纯java的eclipse的性能也让人难受,服务端也要分应用,也不是什么服务端程序都适合用Java,通常都是语言本身的性能不会是最大的瓶颈的场景,因为有些场景最大的瓶颈可能是IO或者数据库等。为什么JIT不能让Java赶上C++呢,理由很简单,编译型语言也不是只有C/C++,还没有哪个语言做的到,JIT就能?显然不现实,其实这是语言的特性决定的,C的实现是为了性能可以放弃高级特性,C++的性能也是其最重要的目标之一,而其它语言都是为了高级特性可以牺牲性能,从语言定位上来说,再怎么优化也不可能赶上C/C++,因为优化是不可能违反语言的定位的,这其实是鱼与熊掌不能兼得的问题。只要在性能能满足应用的情况下就可以用,但不要老夸大,越自卑的人自尊心越强,人总是不喜欢承认弱点,但也没必要过分强调这不是弱点,越强调反而越让人怀疑
说到性能问题我觉得.net 相对还是比较实在的,当年我用.net 1.1 的时候,性能是非常差的,一个普通的WinForm窗口,如果在里面排列多一点的控件的话,运行时都能看出来你拖放控件的顺序,非常明显,但现在好多了,基本上眼睛是看不出来的,都是一起出来的,所以现在很多Windows程序用.net 表现也非常好
四、GC是Java性能的罪魁祸首之一
我觉得说反了,应该说是Java败坏了GC的名声,因为很多人都是通过Java认识了GC,导致在很多人心中,GC成了慢的代名词,实际上这是普遍对GC是的误解的,GC其实只是个概念,GC曾经考虑过由操作系统实现,自从操作系统都没实现,就由编程语言来实现了,也导致实现的五花八门。至于性能要看具体实现和算法选择,这是一项动态内存管理的技术,与C的malloc/free的作用一样,只是GC可以更高级,malloc/free 通常要按照一定的约定来使用以避免内存泄漏问题,GC与手动内存管理主要区别是GC需要一定的算法来选择如何释放内存,手动的不需要。另一个是释放时机的选择手动的更自由,通常GC不是很自由,我说的通常是指一些语言不允许GC的可控,事实上GC的实现都是可控的,只是一些语言不允许这么做,问题就出在这了,GC的算法需要时间,而GC的算法并不能保证最优,所以会产生性能问题,实际上一个可控的GC对性能和开发效率才是更好的选择,根据情况选择是否要GC自动管理还是手动控制,就像D语言的方案,它使用GC,但性能确很高,而且GC是可控的,你的程序不必完全依赖GC的算法,我一般把这种方式叫半自动的,这样更好,如何管理内存应该是开发者的自由,因为全自动管理的GC有的时候会造成应用程序的卡顿,特别是在不适合的时候出发GC的内存管理,这让有些类型的程序很难接受,比如在射击类的游戏中,或者视频解码程序,哪怕是一点点的卡顿体验也是非常不好的(一秒内少于24桢),但在web这样的应用中,服务端程序短时间暂停客户端几乎感觉不到,即使时间长点用户也会认为是网络问题或者浏览器问题
更多关于GC的内容请参考 http://www.iecc.com/gclist/GC-faq.html
五、网上有很多帖子通过具体代码测试,Java性能超越了C++
不管代码是什么,只要是结果上真的超了,那一定是作弊了,不信你可以亲自验证,前提是你真的懂C/C++,不然可能你会中招,但这些帖子很吸引眼球,引来了众多的不明真想的围观群众。我的观点是在性能可以接受的情况下,语言的特性能带来更多的好处,就是好的选择,这也是PHP为什么能在web开发方面能流行的原因之一。但是有些Java人老是发这种帖子的行为着实让人鄙视,而且我发现好像只有Java喜欢挑战性能,在其它语言上确很少见,这点上值得Java人思考
写在最后:
看到这Java粉们一定会不高兴了,Java优点也很明显,库多,非常多。还有一个很大的优点是,Java开发者不需要对底层技术网络技术等有多么深入的了解就能开发出重量级的应用软件来,从某种意义上讲,这把开发者们从技术细节中解放了出来,更专注于应用逻辑。于是很多重量级的软件就这样诞生了,然后就会有一些人质疑,为什么这样的软件要用Java开发,然后就有人出来说Java一点都不慢,然后 ...... 然后不了了之了。其实就语言本向来说,Java曾经还是不错的。
我们总是谎言听多了慢慢的也就信了,因为很多时候真相是什么可能并不是那么重要
细数那些我们都习惯了的Java谣言的更多相关文章
- 细数iOS上的那些安全防护
细数iOS上的那些安全防护 龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...
- 细数Qt开发的各种坑(欢迎围观)
1:Qt的版本多到你数都数不清,多到你开始怀疑人生.从4.6开始到5.8,从MSVC编译器到MINGW编译器,从32位到64位,从Windows到Linux到MAC.MSVC版本还必须安装对应的VS2 ...
- 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】
转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...
- 细数AutoLayout以来UIView和UIViewController新增的相关API
本文转载至 http://www.itjhwd.com/autolayout-uiview-uiviewcontroller-api/ 细数AutoLayout以来UIView和UIViewContr ...
- 细数MQ那些不得不说的8大好处
消息队列(MQ)是目前系统架构中主流方式,在大型系统及大数据中广泛采用.对任何架构或应用来说, MQ都是一个至关重要的组件.今天我们就来细数MQ那些不得不说的好处. 好处一:解耦 在项目启动之初来预测 ...
- 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)
曾梦想仗剑走天涯,看一看世界的繁华 年少的心有些轻狂,如今你四海为家 曾让你心疼的姑娘,如今已悄然无踪影 犹记得上大学攒钱买了第一台智能手机Lumia 520时,下载的第一首歌曲<曾经的你> ...
- 细数Intellij Idea10个蛋疼问题!
Intellij Idea以下简称IJ. 昨天细数了IJ上的10大666的姿势,IJ确实很智能,在很多方便可以完爆Eclipes,可在某些方面真的被Eclipse秒杀 1.乱码 在Eclipse中很少 ...
- 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework ADO.NET Entity Framework 是微软以 ADO.N ...
- 细数Python Flask微信公众号开发中遇到的那些坑
最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...
随机推荐
- Nginx日常操作和配置
安装位置:/usr/local/nginx配置目录:/usr/local/nginx/conf配置文件:/usr/local/nginx/conf/nginx.conf启动命令:/usr/local/ ...
- gitlab 创建SSH Keys 报500错
gitlab 创建SSH Keys 报500错 看了一下日志 root@322323:/home/git/gitlab/log# cat production.log Errno::ENOMEM (C ...
- MongoDB命令及SQL语法对比
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(col ...
- JS问题汇总
1.Q:$(this)在js中失效,无法获取当前元素 A:function()在被调用时this是指向window的,如果要想指向被点击的元素,一般是将this作为参数传入,例如: <div ...
- npm link 安装本地模块,将本地模块cli化
第三方学习地址 http://mp.weixin.qq.com/s?__biz=MzAxMTU0NTc4Nw==&mid=2661157390&idx=1&sn=6d96e54 ...
- 重置dns
flusdns
- 第一章-第一题(小学生四则运算)--By郭青云
1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...
- vm安装centos 老是出现 grub.conf 配置问题
vm 环境 11 centos 6.5 最开始用的是vm12 发现安装软件一会就出现 客户机操作系统已禁用 cpu.请关闭或重置虚拟机 以为是新机器的cpu或者主板有问题,换vm,换系统依然会出现这 ...
- python2.x与3.x差别
数字常量: 八进制 十六进制 二进制 2:0177 0o177 0x9ff 0b101010 3:0o177 0x9ff 0b101010 多种字符串: 2:一般字符串,Unicode字符串 3: ...
- H5+微信支付报-1问题
1.检查发起支付的参数,全部设置为小写: WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appid", ...