关于 Java 笨重一说

2022-05-07 23:31:10 +08:00
 ojh

今天有个帖子是说 Java 笨重、Spring 框架笨重,看完了总结了“笨重”的几点

内存占用多

这个无可厚非,毕竟运行在虚拟机上。但是之前看过一篇博客对比了 Quarkus (印象中) JIT 和 AOT 两种模式下运行内存的占用,启动初期 AOT 完胜 JIT ,但是高负载情况下两者差不多,所以我想了解下是如果同等高负载的情况下,C++/Go 这类的服务端程序的内存占用跟 Java (最新) 比差距大不大呢。

JRE 很大

这个如果在最新 Java 下面用 jlink 并且压缩一下应该 50MB (包含 JavaFX 了,不包含的没试过) 左右,一个带 JRE 的 Java 应用 50MB 应该还可以接受吧。其实我疑惑的是很多人吐槽 JRE 大,没人吐槽 NodeJS 或者 Python 大么

配置很复杂

估计指的是 Servlet 那套 web.xml 配置以及远古时代 Spring 的 context.xml ,这个我也想吐槽,不过 SpringBoot 应该缓解了这个问题

打出来的包很大

Srping/SpringBoot 为了方便开发提供了很多大而全的东西所以很大,如果你的程序就简单的接口,业务代码也很简单,什么依赖注入、切面、请求体转换、参数校验等等功能都用不到,那也没必要用 Spring 框架。顺便问一句有什么好 Java Web 框架脱离 Servlet 体系又很瘦小的

其实对于我这个 Java 菜鸡来说上面问题都不是让我郁闷的,真正让我郁闷的是 Java 为什么这么多规范!这么多规范真的好吗?

8464 次点击
所在节点    程序员
89 条回复
Macolor21
2022-05-08 09:29:54 +08:00
虽然 Lombok ,但是 JDK 14 不是新增了 Record 了么?从 Scala 上学来了一些
angrylid
2022-05-08 10:06:22 +08:00
1 ,是你自己菜;
2 ,那你为什么不用 xxx 呢;
3 ,楼下补充。
ojh
2022-05-08 10:13:26 +08:00
@angrylid
1 我承认自己菜
2 建议看下全部而不是标题的加粗
angrylid
2022-05-08 10:29:01 +08:00
@ojh 只是自嘲一下,因为我基本认同你的观点。Java 给我感觉就是过度设计过度抽象,有时将一些简单的事情复杂化。
kett
2022-05-08 10:31:22 +08:00
我觉得就是因为有这么多规范,才保障了项目整体的可控,虽然啰嗦,但是大家都能看懂,比起灵活多样,循规蹈矩的开发方式更适合团队。
引用一条以前看过的评论:当你回到一个综合性的大型项目中,你会觉得 Java 积累下来的整个技术体系是如此完善,就像一个工业化标准一样。
lux182
2022-05-08 10:51:39 +08:00
java 是面向工程的
brust
2022-05-08 10:54:47 +08:00
没有垃圾的语言只有垃圾的工程师
lisongeee
2022-05-08 10:59:38 +08:00
我看掘金的一篇文章 https://juejin.cn/post/6844904106545381384 这么写:Lombok 会帮我们自动生成很多代码,但这些代码是在编译期生成的,因此在开发和调试阶段这些代码可能是“丢失的”,这就给调试代码带来了很大的不便。

另外我有点好奇,我看的 java 代码例子里几乎所有字段都需要手动加 setter 和 getter ,但是多数情况下 java class 只有很小一部分字段或者没有字段的 setter 和 getter 会被重写,所有对于其他字段而言,我为什么总是要生成一堆啥也不干的 setter 和 getter 呢?难道只是为了调用的时候统一风格吗?

现在 jvm 系列的语言我已经转 kotlin 了,虽然我是个写 ts 的前端 :)
hingbong
2022-05-08 11:13:17 +08:00
Java14 不是有 record class 吗
FreeEx
2022-05-08 11:17:19 +08:00
[一个简单的请求处理分了好几层,写得贼难受]

下图摘自 《整洁架构之道》

https://tva4.sinaimg.cn/large/a977d012ly1h20trzmyz7j22c03407wk.jpg
lisongeee
2022-05-08 11:34:21 +08:00
还有,Lombok 都已经在编译期间修改代码添加 setter 了,为什么不一步到位把外部调用 obj.key = xxx 也修改成 obj.setKey(xxx) 呢,这样就没必要为所有字段添加 setter 了啊,你不加注解正常访问的时候 obj.key = xxx ,然后加了 Lombok 的注解,就在编译期间转换成 obj.setKey(xxx) ,这不就变相实现了 java 没有的语法层级的 setter 了吗?
statumer
2022-05-08 11:41:11 +08:00
用 Spring Web 的 Java er 真没资格和 go/c++碰瓷性能差距,人家都工业界大规模用上 epoll 了,Spring 还在整 one request per thread 和同步阻塞 JDBC 呢,先把自己服务 QPS 提高到人家 go 一半再讲吧。
更搞笑的是 Spring Webflux 优化太垃圾竟然和 Spring Web QPS 五五开,官方在文档里美其名曰 reactor 和 one thread per request 没有性能差距,只是 reactor 负载方差更小。
用 vertx 这类异步网络库的 Java er 谈性能我没意见,用 Spring 的还是算了。
liprais
2022-05-08 11:43:52 +08:00
@statumer 访问数据库都是同步的,惊喜不
sheep3
2022-05-08 11:46:05 +08:00
还是 java 库方便,自动注入啥都不用想
Cu635
2022-05-08 11:51:01 +08:00
@geekvcn
“第一点内存占用多,你为什么不用 C++写项目?有人逼着你用 Java 写?”
还真的是有人“逼”得:公司前人选择了 Java 之后,新接手的时候要么用更好的语言重新写,要么就只能继续用 Java ,公司领导不让重新写的话不就是“逼”得么……
ragnaroks
2022-05-08 11:51:06 +08:00
对于 java 的主要战场后端来说,“笨重”并不是问题,后端都是可水平扩展的,只能说性能差会多用服务器
yolee599
2022-05-08 11:54:06 +08:00
但是 java 代码的可读性很高啊,标准化生产
slert
2022-05-08 11:54:49 +08:00
确实有些是为了规范而规范,如果是个人项目的话,java 并不阻止你摆脱这些人为的规范。
seakingii
2022-05-08 12:07:00 +08:00
"笨重"是相对的,和 GO 之类的比,肯定是"笨重"的;比如你要实现一个简单的代理服务,放在路由器上用,你会考虑占几百 M 内存的,还是占十几 M 内存的?

"笨重"并都都是坏事,如果一个项目很复杂,需要 JAVA 这种"笨重"的玩意.

每种语言有自己的生存土壤,没必要也不可能一种语言打天下.不是说技术上做不到,是成本太高.比如你不可能用汇编语言写你的企业级业务系统,但可能会在某些热点方法上用点汇编来优化.
teem
2022-05-08 12:08:18 +08:00
#OP 顺便问一句有什么好 Java Web 框架脱离 Servlet 体系又很瘦小的
ACTFramework : https://github.com/actframework/actframework
早年的 Play! Framework 1.x 也是不错的选择

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX