<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>《后端程序员一定要看的语言大比拼：Java vs. Go vs. Rust》的评论</title>
	<atom:link href="http://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/feed/" rel="self" type="application/rss+xml" />
	<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/</link>
	<description>一个程序员的心路历程</description>
	<lastBuildDate>Wed, 25 Mar 2026 09:21:20 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>作者：chen</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7772</link>
		<dc:creator>chen</dc:creator>
		<pubDate>Tue, 20 Aug 2024 10:16:16 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7772</guid>
		<description>你扯一堆也改变不了java吃内存的事实.</description>
		<content:encoded><![CDATA[<p>你扯一堆也改变不了java吃内存的事实.</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：bigwhite</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7767</link>
		<dc:creator>bigwhite</dc:creator>
		<pubDate>Wed, 17 Jul 2024 10:48:10 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7767</guid>
		<description>语言争论总是会被人吐槽的:)</description>
		<content:encoded><![CDATA[<p>语言争论总是会被人吐槽的:)</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：DawnErr</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7766</link>
		<dc:creator>DawnErr</dc:creator>
		<pubDate>Wed, 17 Jul 2024 08:11:33 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7766</guid>
		<description>话说作者不要什么都随便翻译过来啊，去原来的博客那边去看了一眼，下面全都在吐槽原作者对 JVM 不熟悉而且做了很多不公平的比拼。甚至原作者自己编写的 java 测试代码都出现啦 OOM 的情况，JVM 的参数也很随意，在这种情况下比性能太没意义了。
结论：这个完全算不上后端必看，感觉更像一场不公平的斗蛐蛐</description>
		<content:encoded><![CDATA[<p>话说作者不要什么都随便翻译过来啊，去原来的博客那边去看了一眼，下面全都在吐槽原作者对 JVM 不熟悉而且做了很多不公平的比拼。甚至原作者自己编写的 java 测试代码都出现啦 OOM 的情况，JVM 的参数也很随意，在这种情况下比性能太没意义了。<br />
结论：这个完全算不上后端必看，感觉更像一场不公平的斗蛐蛐</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：Tacitus</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7765</link>
		<dc:creator>Tacitus</dc:creator>
		<pubDate>Sat, 13 Jul 2024 00:41:29 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7765</guid>
		<description>所以C/C++发展到后来的性能关键点，会自己去实现内存池/对象池。go的GC我没有深入了解过，但是go的语言维护者完全也可以有他们一套自己的内存申请策略，而不会随意调用系统级的内存分配函数。最后补充一点，malloc和free并不是直接操作内核级函数的，这两个函数一样是C标准库的封装函数，系统级的内存都是按页去申请的。</description>
		<content:encoded><![CDATA[<p>所以C/C++发展到后来的性能关键点，会自己去实现内存池/对象池。go的GC我没有深入了解过，但是go的语言维护者完全也可以有他们一套自己的内存申请策略，而不会随意调用系统级的内存分配函数。最后补充一点，malloc和free并不是直接操作内核级函数的，这两个函数一样是C标准库的封装函数，系统级的内存都是按页去申请的。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：bigwhite</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7566</link>
		<dc:creator>bigwhite</dc:creator>
		<pubDate>Fri, 03 Sep 2021 10:23:58 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7566</guid>
		<description>别激动，这是一篇译文！可以打开原文链接，问问原作者:)。</description>
		<content:encoded><![CDATA[<p>别激动，这是一篇译文！可以打开原文链接，问问原作者:)。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：aszswaz</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7565</link>
		<dc:creator>aszswaz</dc:creator>
		<pubDate>Fri, 03 Sep 2021 07:28:50 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7565</guid>
		<description>另外我再说一点，博主说的Java的那100MB内存是平白占用的观点也是不对的。
这个和Java GC的特点有关系。Java GC的特点是：占尽所有可用的内存。
我举个例子:
在控制台执行一下指令：
java -Xms214M -Xmx214M Demo
上面指令中，参数 -Xms是最小可用内存，-Xmx是最大可用内存，如果Java应用程序使用的内存超过-Xmx参数所指定最大可用内存，那么就会出现java.lang.OutOfMemoryError: Java heap space。

public class Demo {
    public static void main(String[] args) {
         while(true) {
             new Object();
         }
    }
}
以上的代码会导致程序把214MB内存占用完毕。但是程序会崩溃？当然不会，在前期 new Object()的时候，GC会向操作系统要新的内存，直到GC管理的内存达到214MB（参数 -Xmx指定的），GC便不再索取新的内存，但是已经占有的内存，GC也不会归还给系统。
这214MB内存会被GC用于新的 new Object()，以此来避免频繁的向系统申请内存和销毁内存所带来的开销。不知道博主会不会C语言，C语言的malloc()函数（申请内存）和free()函数（释放内存），这可是内核函数，应用程序调用内核，造成的内核调用，带来的开销是C语言老生长谈的问题，GO同样是基于C发展来的，同样无法避开这个魔咒。
回到博主所说的100MB内存占用问题上，这100MB内存同样也属于预先占用的内存，具体情况与上诉类似。
从这些角度来看，我是认为Java GC是要比GO的GC机制要更加强大的，虽然看上去平白占用的内存很多。</description>
		<content:encoded><![CDATA[<p>另外我再说一点，博主说的Java的那100MB内存是平白占用的观点也是不对的。<br />
这个和Java GC的特点有关系。Java GC的特点是：占尽所有可用的内存。<br />
我举个例子:<br />
在控制台执行一下指令：<br />
java -Xms214M -Xmx214M Demo<br />
上面指令中，参数 -Xms是最小可用内存，-Xmx是最大可用内存，如果Java应用程序使用的内存超过-Xmx参数所指定最大可用内存，那么就会出现java.lang.OutOfMemoryError: Java heap space。</p>
<p>public class Demo {<br />
    public static void main(String[] args) {<br />
         while(true) {<br />
             new Object();<br />
         }<br />
    }<br />
}<br />
以上的代码会导致程序把214MB内存占用完毕。但是程序会崩溃？当然不会，在前期 new Object()的时候，GC会向操作系统要新的内存，直到GC管理的内存达到214MB（参数 -Xmx指定的），GC便不再索取新的内存，但是已经占有的内存，GC也不会归还给系统。<br />
这214MB内存会被GC用于新的 new Object()，以此来避免频繁的向系统申请内存和销毁内存所带来的开销。不知道博主会不会C语言，C语言的malloc()函数（申请内存）和free()函数（释放内存），这可是内核函数，应用程序调用内核，造成的内核调用，带来的开销是C语言老生长谈的问题，GO同样是基于C发展来的，同样无法避开这个魔咒。<br />
回到博主所说的100MB内存占用问题上，这100MB内存同样也属于预先占用的内存，具体情况与上诉类似。<br />
从这些角度来看，我是认为Java GC是要比GO的GC机制要更加强大的，虽然看上去平白占用的内存很多。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：aszswaz</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7564</link>
		<dc:creator>aszswaz</dc:creator>
		<pubDate>Fri, 03 Sep 2021 07:03:41 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7564</guid>
		<description>我建议博主把Java、go和rust的测试代码都展示出来，看那份比对表，我有些好奇博主是怎么测试Java，是使用 tomcat 吗？还是Nettry？还是自己使用 socket 写的一个简易的 HTTP server？
java的多线程并发模型与go和rust的差距非常大。
go的处理模式是来一个请求直接使用go关键字创建线程就行，因为创建线程的开销很小。
但是Java不是这样的，Java对于请求的到来是从线程池中已经创建好的线程抽调一个线程来处理请求。而不是一个请求来了再临时去建立线程（这是GO的做法，但是没有Java开发者会做这样愚蠢的行为）。
此外，在线程池的基础上，再搭配NIO，让一个线程去处理多个Socket连接。
线程池 + NIO + HASH时间轮 一套组合才能让 Java 的并发达到极致，虽然我承认必须要非常扎实的基础，才能真正的把这一套玩好。
博主字节也说了，平常主要使用和学习 GO 和 Rust，我并没有和楼主吵的意思，只是想要看看博主测试的代码，同时呢，Java的高并发门槛比GO要高的多，拿GO高并发模型，套用到Java，这是一个很愚蠢的行为。</description>
		<content:encoded><![CDATA[<p>我建议博主把Java、go和rust的测试代码都展示出来，看那份比对表，我有些好奇博主是怎么测试Java，是使用 tomcat 吗？还是Nettry？还是自己使用 socket 写的一个简易的 HTTP server？<br />
java的多线程并发模型与go和rust的差距非常大。<br />
go的处理模式是来一个请求直接使用go关键字创建线程就行，因为创建线程的开销很小。<br />
但是Java不是这样的，Java对于请求的到来是从线程池中已经创建好的线程抽调一个线程来处理请求。而不是一个请求来了再临时去建立线程（这是GO的做法，但是没有Java开发者会做这样愚蠢的行为）。<br />
此外，在线程池的基础上，再搭配NIO，让一个线程去处理多个Socket连接。<br />
线程池 + NIO + HASH时间轮 一套组合才能让 Java 的并发达到极致，虽然我承认必须要非常扎实的基础，才能真正的把这一套玩好。<br />
博主字节也说了，平常主要使用和学习 GO 和 Rust，我并没有和楼主吵的意思，只是想要看看博主测试的代码，同时呢，Java的高并发门槛比GO要高的多，拿GO高并发模型，套用到Java，这是一个很愚蠢的行为。</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：咖啡</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7536</link>
		<dc:creator>咖啡</dc:creator>
		<pubDate>Sat, 06 Feb 2021 15:09:22 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7536</guid>
		<description>Java的GC不是全程需要STW的，不管是现在默认的G1还是实验中的ZGC。
其中ZGC可以控制STW在10ms以内
而且Java也不是纯编译语言，基于虚拟机可以实现动态代理等设计，极限需要性能的地方，也可以利用HikariCp的实现方法直接优化字节码</description>
		<content:encoded><![CDATA[<p>Java的GC不是全程需要STW的，不管是现在默认的G1还是实验中的ZGC。<br />
其中ZGC可以控制STW在10ms以内<br />
而且Java也不是纯编译语言，基于虚拟机可以实现动态代理等设计，极限需要性能的地方，也可以利用HikariCp的实现方法直接优化字节码</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：马江林</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7525</link>
		<dc:creator>马江林</dc:creator>
		<pubDate>Fri, 11 Dec 2020 10:19:24 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7525</guid>
		<description>Java 适合企业应用，如果一个应用如下：查询购物车里商品，查询各个商品的价格和优惠，查询当前用户的优惠券，查询库存，然后生成订单，扣减库存，给用户发送通知，这里牵扯到很多次查库和写库，甚至有可能是多个系统之间的调用，这种场景下，一个操作少几毫秒意义并不大，因为数据库操作或者跨系统调用才是性能瓶颈</description>
		<content:encoded><![CDATA[<p>Java 适合企业应用，如果一个应用如下：查询购物车里商品，查询各个商品的价格和优惠，查询当前用户的优惠券，查询库存，然后生成订单，扣减库存，给用户发送通知，这里牵扯到很多次查库和写库，甚至有可能是多个系统之间的调用，这种场景下，一个操作少几毫秒意义并不大，因为数据库操作或者跨系统调用才是性能瓶颈</p>
]]></content:encoded>
	</item>
	<item>
		<title>作者：刘冬季</title>
		<link>https://tonybai.com/2020/05/01/comparison-between-java-go-and-rust/#comment-7460</link>
		<dc:creator>刘冬季</dc:creator>
		<pubDate>Wed, 08 Jul 2020 09:20:05 +0000</pubDate>
		<guid isPermaLink="false">https://tonybai.com/?p=2901#comment-7460</guid>
		<description>写的真不错，我是这样理解的，从资源占用来看，java真的被新生代语言go,rust完爆了，资本家当时希望节省机器成本。然而开发效率大部分时候都比机器成本要珍贵，毕竟人力成本现在远远大于机器成本的，而java到现在，框架和库多如繁星，浩如烟海，给开发效率带来很多的提升，而且很多老系统大而不倒，这个没法说直接退去，而是逐渐逐渐漫漫隐去，这个时间可能是以百年为时间跨度的。而go 作为机器高效和人力高效的替代品，真的很有吸引力了，很多新公司都选择以go为技术栈。在系统编程方面，有垃圾回收器的都不能用，rust在这方面就是挑战c和c++的，特别是c++，太难掌握了，内存回收，带来很大的心智负担。</description>
		<content:encoded><![CDATA[<p>写的真不错，我是这样理解的，从资源占用来看，java真的被新生代语言go,rust完爆了，资本家当时希望节省机器成本。然而开发效率大部分时候都比机器成本要珍贵，毕竟人力成本现在远远大于机器成本的，而java到现在，框架和库多如繁星，浩如烟海，给开发效率带来很多的提升，而且很多老系统大而不倒，这个没法说直接退去，而是逐渐逐渐漫漫隐去，这个时间可能是以百年为时间跨度的。而go 作为机器高效和人力高效的替代品，真的很有吸引力了，很多新公司都选择以go为技术栈。在系统编程方面，有垃圾回收器的都不能用，rust在这方面就是挑战c和c++的，特别是c++，太难掌握了，内存回收，带来很大的心智负担。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
