我正在运行一个docker容器,它绑定了java应用程序(java 1.8(
我的问题是我的物联网设备内存有限(RAM 2 GB,需要由5个应用程序共享(。
当我尝试运行我的应用程序时,我保留了450 MB的RAM,并将50%分配给JVM,如下所示:
FROM openjdk:8u252-jre-slim-buster
ADD myIotApp.jar myIotApp.jar
ADD jsr47min.properties jsr47min.properties
CMD java -Djava.util.logging.config.file=jsr47min.properties -jar -XX:+UseContainerSupport -XX:MaxRAMPercentage=50.0 -XshowSettings:vm myIotApp.jar
我知道JVM需要一些内存才能平稳运行,并且存在一些兼容性问题(如以下线程中所述(:https://developers.redhat.com/blog/2017/03/14/java-inside-docker/
但我接受了克服这个问题的建议。
但我观察到,一旦应用程序执行一些复杂的操作,它就会消耗几乎80%的内存,但一旦计算完成,它就永远不会释放回来
有什么办法解决这个问题吗?
或
对于这样的环境,java是一个不错的选择吗?
我想java不应该是您环境中的首选语言。但有时已经做出了选择,您必须在受限制的设备中运行该应用程序。因此,你可以注意以下几点:
作为开发人员,尽量让应用程序使用尽可能少的内存。这可以通过查看RAM、缓存等中存储了多少信息来实现。使用可以流式传输数据和从磁盘存储/加载的算法。确保您的应用程序没有内存泄漏,并尽早释放内存。
作为系统集成商,即使JVM行为不端,也要确保系统稳定性不受影响。对JVM设置合理的内存限制,使其在OutOfMemoryError上死亡,而不是损害其他进程。为了安全起见,还配置容器上的内存限制。然后将Docker配置为在应用程序死亡时自动重新启动容器。