docker 低RAM限制的本机内存(1g)

n53p2ov0  于 2023-11-17  发布在  Docker
关注(0)|答案(2)|浏览(122)

我在Docker中运行一个Java应用程序,最大RAM为1g。我已经将Java堆减少到-Xmx256m。尽管如此,Java进程使用的更多,并且经常超过1g,使其被操作系统杀死。我读过Java native memory,基本上了解发生了什么。
但是,除了添加足够的交换空间和接受潜在的性能损失之外,是否有方法可以最小化所需的内存(包括本机内存)?我已经提到要查看GraalVM:任何反馈?这是否意味着,例如,我需要为不同的架构(Intel,ARM,.)编译应用程序?

bvuwiixz

bvuwiixz1#

关于在运行时使用更少的RAM,GraalVM Native Image肯定会给你给予。取决于你的应用程序在做什么,你甚至可以比256 M低得多。但是,是的,你需要为每个平台单独编译。像GitHub动作这样的东西可以帮助你。

6l7fqoea

6l7fqoea2#

JIT(即时)和AOT(提前)编译是在编程语言中编译和执行代码的两种不同方法。
以下是它们之间的区别

编制时间
JIT:在JIT编译中,代码是在运行时即时编译和执行的。当程序运行时,源代码或中间代码在执行之前被转换为机器代码。
AOT:AOT编译提前发生,通常在程序运行之前。整个代码在执行之前被编译成机器码或低级表示。
执行速度
JIT:JIT编译的代码由于编译步骤的原因,启动时间可能会稍微慢一些,但它可能会针对特定的运行时环境优化代码,从而有可能提高应用程序生命周期中的执行速度。AOT:AOT编译的代码通常启动时间更快,因为不需要进行动态编译。但是,它可能不如JIT编译的代码有效地适应运行时环境。
资源利用率
JIT:JIT编译会在编译过程中消耗额外的内存和CPU资源。一旦代码被编译,它可以更有效地利用内存,因为它针对特定的执行路径进行了优化。AOT:AOT编译的代码在执行期间倾向于消耗更少的内存和CPU资源,因为没有内存中编译过程。在执行速度方面,它可能不如JIT编译代码那样资源高效。
可移植性
JIT:JIT编译的代码可移植性更强,可以适应不同的运行环境,在跨平台应用中经常使用。
AOT:AOT编译的代码可移植性可能较差,因为它针对特定的平台或架构进行了优化,并且可能需要针对不同的环境进行重新编译。


的数据
在Java中,以前只有运行在jvm上的JIT编译可用。GraalVM启用AOT编译(本机编译)
最好根据系统所需的特性选择更合适的策略,在这种情况下,节省内存很重要,所以我认为AOT编译会很有帮助
你可以查看这个博客。在这个博客中,当使用gralvm编译时,它节省了大约40%的内存。



https://medium.com/graalvm/graalvm-for-jdk-21-is-here-ee01177dd12d
我想你正在使用Sping Boot ,检查这个文档会很有帮助。
https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html

相关问题