Java语言给人的印象是长盛不衰,从笔者上大学的时候,就不断地听到有什么语言会取代Java的观点,但时至今日,Java依然是应用范围最广的语言。并不是Java有多么完美,而是Java依托Oracle这个庞大的生态系统,在可预见的未来无人能撼动。也正因为这样,Java也愈加成熟完善。

但是在网络开发领域,Java并非一枝独秀。源于互联网开发的特点,对并发性的要求较高。而go语言实施起来较为简便,而且并发性较好,运行效率较高,同时也具有一定的安全性。对于很多讲究简洁精悍的网站,用go语言来开发网站后台就显得比较完美。

从语言的特性来讲,Java与C有较大的差异,而go与C则更为接近。有些人认为go是介于C和C++之间的语言,但其实并不是,这个我们稍后再说。正因为它类C的特点,所以有C语言基础的同学上手go会特别的容易。和Java相比,go语言最大的特点是简洁,将关联数组内嵌其中,算法简洁。同时,从并发性角度来讲,go解决了并发编程中的很多问题,毕竟比Java年轻十几岁,可以说go站在了巨人的肩膀上,在CPU缓存方式、线程、锁进行了优化,数以万计的协程能够顺利在一个进程中执行,并且保持较高的性能。

在GC回收方面,从理论上讲go在算法上进行了大量的优化,解决了Java中存在的GC暂停的情况。其实,坦白的讲,在实际应用中,笔者尚未体验到其GC优化后的便利,但至少go的垃圾收集器采用了并发特性,非常适合当前很多服务器的硬件属性。至于go的内存调优,还是一个值得商榷的问题。

找来一些资料,分享一下,也许能对题主的问题有所帮助。

作者:我是皇上

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。GC吞吐量:GC时间与堆大小同步增长。简单来说,你的程序使用的内存越多,内存释放速度就越慢,你的计算机花费的时间就越多。如果你的程序没有并行化,你可以不用考虑这个问题。

整理:因为没有整理,GC 过程会产生内存碎片。程序也不会受益于在缓存中整齐排列的内容。

程序吞吐量:因为GC必须在每个周期做很多工作,所以会消耗不少CPU时间。

暂停分布:与程序并发运行的任何垃圾收集器都可能遇到Java中“并发模式失败”的问题:您的程序创建垃圾的速度比GC线程可以清除它快。在这种情况下,runtime别无选择只能完全停止程序,等待GC完成垃圾收集。因此当Go团队声明GC暂停非常低时,该声明只能适用于GC具有足够的CPU时间和空间以完成垃圾回收的情况。另外,由于Go编译器缺乏确保线程可以被快速可靠暂停这一功能,会导致暂停时间是否很低取决于您运行的是什么类型的代码(例如,base64 解码单个 goroutine 中的大 blob 会导致暂停时间上升)。

堆开销:因为通过标记/扫描收集堆非常慢,您需要大量的空间以确保不会遇见“并发模式故障”。 Go默认使用100%的堆开销会让程序需要的内存量增加一倍。

从面向对象的角度来比较,go并非真正意义上的面向对象编程的语言。面向对象必须满足:封装、继承、多态三大特点,在Java中class的属性和方法,在go中是不存在的,在继承方面,go至少与Java的继承方式不一样。可以说go与面向对象的定义打了擦边球,和面向过程的C相比,适应了很多应用场景。在go语言中,同一struct可实现多个接口,使得它比C的应用场景大为扩展。

虽然go语言被称为网络时代的C语言,但笔者并不建议初学编程就接触go。你可以像计算机专业的同学一样,从C开始,打好基础;也可以直接从Java开始入门,从而有更多的工作职位可供选择。虽然go近年来的上升势头较快,但其优势也并非绝对明显,所以将go作为第二或第三语言还是比较合适的。