IDEA升级2023后,java8(jdk8)的heapSize设置无效,导致编译OOM问题的艰难排查

文章讲述了作者在使用Java8进行项目开发时遇到的内存溢出问题,发现JDK8的默认内存限制导致编译过程受限,即使设置了较大的堆内存也不起作用。升级到JDK17和11后问题得以解决,揭示了可能是Idea2023对Java8的兼容性问题。
摘要由CSDN通过智能技术生成

CSDN的小伙伴大家好,我是编哥

昨天分享java21发布的一些新特性。但我相信,仍然有很多项目在用java8。

其实java8多香啊,多好用啊!没事升啥jdk啊?编哥我一直这么认为。直到上个月,我发现我的工程编不过了,而且就跟java8关系很大!

事情是这样的

有一个项目我介入了一段时间,中间有一阵子没管。突然一天又需要用起来,赶紧打开跑一把,结果:

竟然编译到内存溢出了?!

网上一顿收,都说加大Heap内存,默认的太小啥的。于是我把内存加到6G,不行,再搜,说加大 Idea memory settings,巴拉巴拉,嗯,我加,我都加~

一顿操作,发现还是不行。见鬼!我之前是编过的,而且好好用了一段时间的。

赶紧问问最近编过这个工程的同事,他电脑内存16G,给idea heap 设置的8G,我去,太狠了,这啥工程非要吃这么大内存。于是我也把heap size设置到8G:问题依旧,10G:不行,12G:fail,我去!这时,我觉得应该不是内存不够。

我请他再次确认,同事几分钟轻松编完整个工程,这让我开始怀疑我的 macbook 的问题了,因为他用的是windows电脑。

于是我打开macOS的资源监视器,果然发现,每次编译的那个java进程在内存占用到4G了之后就不再增加了。然后Idea的build console就会输出频繁GC的报错,然后就OOM了。

艾玛,明明设置的8G,你TM只吃一半就不吃了?

然后网上又搜到一个地方要设置,我再次设置为8G,问题依旧~ 嘶~ 这已经没办法了吗~

然后又再stackoverflow上搜到一个说法,说是jdk8的默认内存有个啥参数,最大只能占4G,我去,还有这种事情。我看了一下,这个参数好像又没啥办法能很方便地修改。这还让不让人干活了!

转机!

既然jdk8有限制,诶~ 我赶紧把工程的jdk改成17,然后经过一场艰苦卓绝的优雅适配狂删代码,重新run,还真编过了!!

当看到这个build success,编哥这已经压抑了大半天的郁闷一下就释放了大半截!

编译过程中,我注意观察,编译的这个java进程内存是会吃到6G+的。也就是说,我这里编译用jdk8会出现编译进程内存被限制在4G的bug,这TM谁挖的坑啊~

但是,这并不能代表问题已经解决。编哥的艰苦排查仍未停止。既然jdk17可以,再试试jdk11,嗯,又编过了~ 反复测试,发现就java8不行。八哥啊八哥,你咋就不行了?

“这...要么就把咱工程升级到11吧,就是要改一些代码适配...” 编哥我小声BB了一下。

一旁的同事甩我一句:我们用java8都行,就你不行!你不行!不想想是不是你RP不够。升啥jdk,不如提升一下你RP试试?

这...请问RP怎么升,我下班去扶老阿姨过马路?谁TM叫你们把工程撑得这么大,编译都要超过4个G的内存?谁TM叫你们这么久了都不分模块?谁TM...

哥不甘心,继续试验

算了,谁TM管他们。连个破编译都搞不定,我以后还怎么好意思叫编哥?如果要靠升jdk来解决,那我不如改叫升哥或者RP哥算了!编,给我继续编!哥今天就不信编不过你丫!

然后降回java8,一顿捣鼓各种尝试,突然惊喜发现,用maven的package命令又能编过!只是用Idea的run不行!这...玄学,一定是玄学!

我把这个玄学告诉那个同事,他突然来了句,你用的idea啥版本。我说前几天才升了最新的2023版。他说,“你真骚气,用这么新的,我还用的2020版。”

我淡淡一笑:“哈哈,你个土鳖,还用2020这么老的。你看2023版这logo多靓,这界面多么骚气啊~ 你再看这体验,多么爽滑...” 唉等会!我之前还能编过,前几天升了Idea,难道是...我擦!

不慌,把Idea重新安装回2021版,run起来,编过了!!!我擦我擦我擦,搞了半天,是升Idea升出来的问题!难道2023版对java8的兼容搞出了问题?

打破砂锅问到底

又经过一顿搜索,发现还真有人在jetbrain的官网上提了这个问题,而且情况跟我一样,都是用的jdk8,heap size设置不生效,同样的工程和配置2021版就是好的:

注意看,提问日期是2023.08.23,相当近啊。jetbrain的官方大佬一开始也回答就是两个设置heap size的地方

但这位朋友说设置了还是无效:

后来换了一位jetbrain的大佬如下回答,然后提问者尝试后有效了!nice啊!666啊!

大佬原话的意思,是javac的进程OOM了,不是build的进程。而javac是从idea 的build system fork出来的,用的就是这个菜单里设置的heap size。

虽然大佬是这么解释了,但这个问题,从编哥实验来看,就针对jdk8才有问题。总觉得,要么就是idea 2023版引出来的bug,毕竟同样的设置你2021版都好好的啊!要么就是他们也不想玩jdk8了[狗头]

后续

编哥本想马上试试的,但已经降回2021版了,怕万一又出现别的啥问题,那就又要耽误工作了。还是完成任务要紧,过几天再升。

疯狂搬砖几天后,编哥手里任务见少。于是想再试试这个问题。但猛地瞟见,这个工程已经被升级到jdk11了!原来前几天有同事在重构一个模块时,觉得jdk8不太够用了,比较麻烦,就跟leader说了说,拉上架构师讨论后,把jdk升了。这...好吧,看来,是时候提升我的RP了。

于是,最近几天,每到夜幕降临,我厂楼下总能看到一个淡薄的身影,满脸热情地搀扶来往的老奶奶过马路~

最后再BB几句

做编程经常会遇到这种玄学一样的问题。如果项目时间又紧,还碰到一个很久都解决不了的阻塞问题,每天可能都会无数次怀疑人生。如果没有内心对这行的热爱和坚韧的意志,干着会更难受。

前几天跟应届生聊天,发现很多学生选择计算机就是冲着工资来的,内心对这个专业没啥热情。

就算不热爱这行,毕业也能找个工作,工资还行,这也没错。但编程这事吧,变化太快了,需要比较高强度的持续学习。如果没有内心的热爱,很难坚持多年还不停学习。很可能三年五年还是每天做同样的工作,成长稀微。原地踏步,到年龄大了,也许,就更容易迷茫焦虑吧。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值