现在 Java 界推崇“use Jar, not War”,但是这 Jar 的内存占用也太。。。。。。

2018-12-06 11:33:50 +08:00
 abcbuzhiming
以前我们部署 Java 的 Web 应用,都是搞个 Tomcat 或者 Jetty 这样的 Servlet 容器服务器装到到目标机器,然后每个应用 App 在 Servlet 容器服务器占据一个上下文路径来提供自己的服务。这样的服务器启动时占的内存不大,也就 1GB 左右,但是内部的应用会互相干扰抢占资源占用,有的时候一个应用出现了无法卸载的死机,你会不得不把整个 Servlet 容器服务器停下来。最近的 Java 界,大家都推崇直接用 Jar 包跑,反正 jar 包里有内嵌的 Servlet 容器服务器。好处就是各个 Jar 之间可以互不干扰了,但是这启动内存占用真是吓人,1 个启动的时候都接近 1G 了,一台服务器上启动几个 Jar,内存就要没了。我想了想,这应该还是 Servlet 容器服务器的锅,内嵌的容器服务器那也是服务器啊。所以我想问问各位:
1.你们这么看待和解决这个问题?
2.业界最近有干脆去掉 Servlet,用别的方式提供 Web 服务的声音,而且确实出现了这样的框架,有人实践过吗,有好处吗?资源占用情况如何
9884 次点击
所在节点    Java
44 条回复
msg7086
2018-12-06 12:49:46 +08:00
@abcbuzhiming #12
反过来说。没有钱上多台服务器或者高配服务器的,为什么要去用 Java 呢。
就像以前用 Oracle 的,十年前大家都在说,Oracle 一开,几十 G 内存就没了。那时候 48G 内存的至强都是要有点矿才能买得起了。那所以小公司没人去搞 Oracle 啊。一样的道理。
Java 的本来设计得就是用大内存换取高性能,买不起内存是你公司的事,你想想不充钱能变强吗(笑)
passerbytiny
2018-12-06 13:14:52 +08:00
请善用 Xms、Xmx 参数。如果你的程序小,那么请使用 java -Xms32m -Xmx64m -jar some.jar 来启动。不加参数,5 个 java 进程就能占满内存。
q397064399
2018-12-06 13:21:30 +08:00
加钱买内存,内存真的很便宜,随便一个程序员的一年的工资 都能买差不多 2T 的服务器内存了。
买服务器内存的钱都没有,你搞什么 Java?
Cbdy
2018-12-06 13:23:12 +08:00
可以不基于 Servlet 做,用 Netty:比如 Vert.x、Spring Web Flux,当然做出来的东西也是 Jar
bdnet
2018-12-06 13:30:08 +08:00
简单来说,单独一个 JVM 实例隔离型好于共享,各有优缺,脱离场景,没有那个一定好

不过,现在一个手机内存都 8G 内存了
HiJackXD
2018-12-06 13:42:27 +08:00
可以用用 playframework1.x 之类的不依赖 servlet 容器的框架 速度和开发体验都比 ssm 好多了
qiyuey
2018-12-06 13:50:35 +08:00
一台机器只部署一个 Jar,目前主流的方法是 Docker + Jar
liuxey
2018-12-06 14:21:40 +08:00
我觉得最终云化后就变得像 Google Cloud Function 和 Amazon 的 lambda,不仅把 tomcat 抽象化,servlet 也抽象化,最终面向 Function 编程。

所以期待 springboot 再次进化,变成一个纯 Serverless 的平台,开发人员面向 Lambda 编程,部署的只是一个一个 lambda,再加入一些可公共调用的 lambda API,完美~
mmdsun
2018-12-06 18:19:13 +08:00
@abcbuzhiming 那算总的。启动 jar 前电脑内存,启动 jar 后电脑内存,两个一减。
mgcnrx11
2018-12-06 18:35:41 +08:00
Xms 堆参数啊,每个机器内存都不同,这样谈占用有什么意义
Cbdy
2018-12-06 19:04:08 +08:00
@liuxey 已经有了,Spring Cloud Function 了解一下
http://cloud.spring.io/spring-cloud-function/
Mohanson
2018-12-06 19:12:52 +08:00
golang 4000 万请求每日, 常年 20 M 内存, 考虑一下(狗头
liuxey
2018-12-06 19:25:26 +08:00
@Cbdy #31 这个之前也了解过了,但是还是太粗糙,只是将传统 controller 稍微封装了下,默认 method -> URI 的映射规则,等以后发展看看会变成什么样吧。
Cellei
2018-12-06 20:31:21 +08:00
抽时间试一下 vert.x
wdlth
2018-12-06 21:20:03 +08:00
不用 Undertow 么?
donyee
2018-12-06 21:36:26 +08:00
要榨取性能的话,就不推荐使用 java servlet 这些框架;
1 个应用都不愿意分配 1G 内存,那么是不是你们这些应用功能比较单一、用户量太小
搞不懂这些...
loveCoding
2018-12-06 21:36:39 +08:00
上线前压测下 , 找到合理的-Xms -Xmx ,不要啥都不管直接开始跑
Vamposine
2018-12-06 21:40:04 +08:00
@abcbuzhiming 如果是生产环境,一个服务器上就独立放一个 service 才是正解,如果物理服务器个数不够,可以虚拟化,做好资源隔离就好
TinyKube
2018-12-07 09:21:10 +08:00
我们这边的微服务模块都慢慢用 go 重写了。云原生时代还是用 Go 吧,Java 的内存占用太夸张了
xinyewdz
2018-12-07 10:19:44 +08:00
使用 jar 启动的,都是使用微服务。每个 jar 提供的服务不多的。你应该是把一个超级大的项目,打包为一个 jar。内存占用肯定大了。

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

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

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

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

© 2021 V2EX