[虚心请教] JDK8 默认的配置环境下,10G 的堆内存 Full GC 一次要 16s 左右,该如何优化?处理一个请求内存耗费大约 900M

2019-10-16 12:42:58 +08:00
 summer7
7134 次点击
所在节点    Java
63 条回复
xuanbg
2019-10-16 13:13:09 +08:00
拆分服务。。。。。。
IamNotShady
2019-10-16 13:14:33 +08:00
一个请求 900M ? 换成 G1 试试
chendy
2019-10-16 13:21:07 +08:00
一个请求 900M…要么极端需求要么设计不合理…
jimrok
2019-10-16 13:23:59 +08:00
把数据拆出来,放在 redis 或者 memcached 里面。否则堆会太大,一旦需要扫描堆就会比较耗时。
reus
2019-10-16 13:24:15 +08:00
换最新版 jvm 和最先进的 GC 算法

不换就不要奢求太多。
coolcfan
2019-10-16 14:45:38 +08:00
也许可以从生命周期的角度检查下请求处理过程中消耗的内存。
lihongjie0209
2019-10-16 14:54:22 +08:00
那也就是说你的这个服务的并发数量 = 10 ??
summer7
2019-10-16 15:57:08 +08:00
@lihongjie0209 是的,这个项目基本等于没有并发。 10 并发也到不了。
summer7
2019-10-16 16:01:10 +08:00
@chendy 需求大概是这样的:从数据库查出 30000 条数据,数据部分字段会包含长文本,单条数据约 200+字段,查出后需要对数据解析,据观察内存涨幅约等于 900m
summer7
2019-10-16 16:10:34 +08:00
@jimrok 数据流程大概是这样,第一步 jdbc 查库,第二步:对每条数据做解析,第三步:入 redis。 目前问题主要集中在解析这个过程 32 核机器跑满也需要 2-4s,稍微来个并发(不到 10 个),10g 的堆因为 gc 导致解析时间会上升到 20s+
yidinghe
2019-10-16 16:15:57 +08:00
1、确认有没有内存泄漏,也就是多次 GC 后程序还是能正常运行并且长期运行;
2、能够对老年代进行非 STW 回收的垃圾收集器只有 G1。建议换 G1 ;
3、进一步对内存使用进行剖析,减少不必要的对象持有;
4、如果缓存数据占大头,那么换用 Redis/memcached 等独立进程的缓存方案。
yidinghe
2019-10-16 16:17:05 +08:00
“从数据库查出 30000 条数据,数据部分字段会包含长文本” 这时候应该改为读取一条处理一条的方式。
summer7
2019-10-16 16:17:09 +08:00
@jimrok 补充:是单次请求解析需 2-4s
misaka19000
2019-10-16 16:21:07 +08:00
用 C 语言重写
learnshare
2019-10-16 16:22:44 +08:00
这需求或实现逻辑并不合理吧
Immortal
2019-10-16 16:24:46 +08:00
单条数据约 200+字段= = 猛老哥
u823tg
2019-10-16 16:26:13 +08:00
换语言? 我胡说的
memedahui
2019-10-16 16:28:35 +08:00
@IamNotShady 我记得 java8 默认就是 G1 吧...还是我记错了
lihongjie0209
2019-10-16 16:31:46 +08:00
@misaka19000 #14 你用 c 语言管理 10G 内存试试, 没啥区别的。
lihongjie0209
2019-10-16 16:32:20 +08:00
@summer7 #9 一次查 3000 条试试?

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

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

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

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

© 2021 V2EX