现在 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 服务的声音,而且确实出现了这样的框架,有人实践过吗,有好处吗?资源占用情况如何
9868 次点击
所在节点    Java
44 条回复
jjianwen68
2018-12-06 11:44:11 +08:00
启动占用 1g 不是 jar 本身占用吧,是服务本身加载的 cache 吧
zjsxwc
2018-12-06 11:45:13 +08:00
加 swap 文件分区就行
sagaxu
2018-12-06 11:48:14 +08:00
springboot 内嵌 tomcat 启动,自身占用内存不到 50M,1g 至少能启动 8 个 app。
lovelybear
2018-12-06 11:48:37 +08:00
所以还是用 war
sagaxu
2018-12-06 11:48:42 +08:00
@zjsxwc fullgc 遇到 swap 就是找死
xiaoyunwei2
2018-12-06 11:52:28 +08:00
总有人想搞点新花样出来
misaka19000
2018-12-06 11:54:50 +08:00
问题在于为什么要在一台负载上面启动多个 jar 进程呢
abcbuzhiming
2018-12-06 11:57:32 +08:00
@jjianwen68 服务本身没有加什么 cache,就是表有点多,50 个表左右,各种 Service,mapper 文件,Controller 也不少
peyppicp
2018-12-06 11:58:27 +08:00
Servlet 容器占不了多少资源。对响应没那么高的应用,可以少开点线程。加个-Xmx2g 啥的参数控制一下吧
jorneyr
2018-12-06 11:58:35 +08:00
用经典的 Tomcat 部署, 多个 Web 可以把都有的 jar 包放到 Tomcat 的共享 lib 里, 不需要每个应用都各自加载一次这些 jar 包, 这样可以省掉不少资源.
abcbuzhiming
2018-12-06 11:58:50 +08:00
@sagaxu 你的 spring boot 怕不是空项目吧?你加上各种 Controller,Service,Mapper,各种逻辑类,还有 Web 模板,静态资源,然后再看看。
abcbuzhiming
2018-12-06 12:01:03 +08:00
@misaka19000 你一定是在大公司,有海量的服务器给你用,中小型公司哪家服务器上就跑一个 jar 的?
mmdsun
2018-12-06 12:15:56 +08:00
说下是什么命里如何查询 jar 占用内存的?是不是有误差。我这边最多 500M
boris1993
2018-12-06 12:25:33 +08:00
@abcbuzhiming #12 裸铁上装 ESXi 啊,然后一个应用开一个虚拟机,资源按需分配,一台虚拟机只跑一个 war 或者 jar
我司就是这个套路,也没有海量服务器,真铁只有个位数,上面跑了一麻袋虚拟机
sagaxu
2018-12-06 12:26:48 +08:00
@abcbuzhiming 各种 Controller,Service,Mapper,各种逻辑类,还有 Web 模板,静态资源

这些东西分开也好独立也好,占用的内存是一样多的,没有被共享的,不就是空项目的那部分开销吗?
tnt666666
2018-12-06 12:29:16 +08:00
推崇??去他吗的推崇
aa6563679
2018-12-06 12:30:32 +08:00
没那么夸张,一个 jar 服务空闲时 gc 后也就占不到 100m。
szq8014
2018-12-06 12:30:46 +08:00
@abcbuzhiming 富应用的话 1G 内存不多吧 0。0
apeshit
2018-12-06 12:36:19 +08:00
遇到这种多个 web services 需要在同一台机器上运行的情况, 为了可靠性和可扩展性, 为什么不使用 kubernetes + docker 的架构? 每个 web service 在自己的容器里面, 可以 configure 每个 service 的资源, replica 和 failover 策略
abcbuzhiming
2018-12-06 12:36:56 +08:00
@mmdsun 我这边是在 windows 发现问题的,windows server 2012R2,任务管理器里,Java Platform SE binary 占用内存 9xx.xxMB。。。
看了你们说的,我现在也在分析是不是我打开 spring boot 的姿势不太对,这个内存占用貌似有点不太正常的样子

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

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

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

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

© 2021 V2EX