Skip to content

有关内存占用的探索

昨日小睡 edited this page Nov 16, 2024 · 4 revisions

介绍

首先感谢 @王于舟 提供的解决方案

对于低性能机来说,往往因物理内存有限,无法支撑服务的部署。当内存占用接近jvm的最大内存时,程序就会疯狂GC,导致cpu过高。当内存占用超过jvm最大内存时,程序就会内存溢出。 @王于舟 提出使用Eclipse OpenJ9代替Oracle OpenJDK的方案,使内存占用大幅度减少,更加适合低性能机。

我尝试使用Eclipse OpenJ9代替Oracle OpenJDK后,对北斗项目进行编译、运行、打包都没有发现什么问题。所以对于北斗项目,Eclipse OpenJ9理应可以完美替代Oracle OpenJDK。

IBM Semeru OpenJDK 下载地址:https://developer.ibm.com/languages/java/semeru-runtimes/downloads/?mhsrc=ibmsearch_a&mhq=semeru

探索

以下数据均在我本人的笔记本电脑上测试,结果仅供参考。

  • CPU:Intel(R) Core(TM) i7-14650HX 2.20 GHz
  • 内存:32.0 GB (31.7 GB 可用)
  • 硬盘:YMTC PC411-1024GB-B
  • 系统:Windows 11 家庭版 22H2

1. 编译耗时

  • 使用OpenJDK编译5次耗时:[11s 997ms, 12s 53ms, 11s 816ms, 11s 960ms, 11s 928ms],平均:11s 950ms
  • 使用OpenJ9编译5次耗时:[12s 925ms, 13s 111ms, 12s 947ms, 12s 681ms, 12s 853ms],平均:12s 903ms

2. 启动耗时

  • 使用OpenJDK启动5次耗时:(springboot:[2.169s, 2.14s, 2.151s, 2.158s, 2.065s], 服务:[4.058s, 4.147s, 4.181s, 4.04s, 4.033s]),平均:springboot:2.136s,服务:4.091s
  • 使用OpenJ9启动5次耗时:(springboot:[3.847s, 3.716s, 3.682s, 3.693s, 3.673s], 服务:[7.207s, 7.064s, 6.606s, 7.177s, 6.439s]),平均:springboot:3.722s,服务:6.898s

3. 启动内存

  • 使用OpenJDK启动5次内存:[809.4MB, 846.7MB, 826.7MB, 785.2MB, 845.5MB],平均:822.7MB
  • 使用OpenJ9启动5次内存:[501.5MB, 501.7MB, 488.4MB, 493.6MB, 497.5MB],平均:496.5MB

4. 热启动耗时

  • 使用OpenJDK热启动5次耗时:[2.267s, 2.128s, 2.121s, 2.063s, 2.082s],平均:2.132s
  • 使用OpenJ9热启动5次耗时:[3.733s, 3.7s, 2.961s, 3.086s, 2.944s],平均:3.284s

结论

总体来说,OpenJ9相比OpenJDK在内存占用方面提升巨大,但是在启动时间和执行速度这一方面稍弱。对于低性能机来说,使用OpenJ9替换OpenJDK无疑是非常划算。用少许时间成本换取大量的内存占用减少,性价比颇高。如果本身机器性能不差,或者是对执行速度有要求的,就没必要进行替换。

另一篇网络文章参考,结论基本和我总结的一致:https://dbaplus.cn/news-134-6328-1.html