容器中Java RAM的使用:不会丢失内存的5大技巧

在本文中,我们希望分享Java内存管理的细节和容器内部的弹性,这些细节乍一看并不明显。

在下面,您将找到要注意的问题列表以及即将发布的JDK版本中的重要更新,以及针对核心痛点的现有解决方法。 我们收集了5个最有趣,最有用的技巧,以提高Java应用程序的资源使用效率。

Docker中的Java堆内存限制

当前,社区正在讨论有关在Docker容器中运行Java应用程序时错误地确定内存限制的问题。

问题是,如果未明确定义Xmx选项,则由于默认的内部垃圾回收(GC)人机工程学算法,JVM使用了可用于主机OS的所有内存的1/4。 如果JVM内存使用量超过为Docker容器定义的cgroups限制,则可能导致内核杀死Java进程。

为了解决此问题,OpenJDK 9最近实现了一项改进:

OpenJDK 9已添加了第一个实验性更改,因此JVM可以了解它正在容器中运行并相应地调整内存限制。” 如果使用Docker运行Java 9发行版将调整内存限制

新的JVM选项( -XX:+ UseCGroupMemoryLimitForHeap )根据cgroup中定义的内存限制自动为Java进程设置Xmx。

作为解决公共Java 9发行前问题的一个不错的解决方法,可以在JVM的启动选项中显式指定Xmx限制。 OpenJDK官方仓库中有一个公开拉取请求,要求“根据docker内存限制设置一个更好的默认Xmx值的脚本”。

Jelastic设法通过结合使用增强的系统容器虚拟化层和Docker映像来省略错误的内存限制确定。 在前面的文章“容器中的Java和内存限制:LXC,Docker和OpenVZ”中,我们解释了它的工作原理。

跟踪本机非堆内存使用情况

在云中运行Java应用程序时,还必须注意Java进程对本机内存的使用,即所谓的堆外内存。 它可以用于不同目的:

  • 垃圾收集器和JIT优化正在跟踪对象图的数据并将其存储在本机内存中。 此外,自JDK8起,类的名称和字段,方法的字节码,常量池等现在位于Metaspace中,该空间也存储在JVM堆之外。
  • 另外,为了获得高性能,许多Java应用程序在本机区域分配内存。 使用java.nio.ByteBuffer或第三方JNI库,这些应用程序存储大型的,长寿命的缓冲区,这些缓冲区由基础系统的本机I / O操作管理。

默认情况下,元空间分配仅受可用本机OS内存量的限制。 再加上Docker容器中错误的内存限制确定,这增加了应用程序不稳定的风险。 限制元数据的大小很重要,尤其是在遇到OOM问题时。 使用特殊选项-XX:MetaspaceSize来执行此操作

由于所有对象都存储在正常的垃圾回收堆内存之外,因此,它们对Java应用程序的内存占用量有什么影响并不明显。 有一篇很好的文章详细解释了该问题,并提供了一些有关如何分析本机内存使用情况的准则:

“几周前,我在尝试分析在Docker下运行的Java应用程序(Spring Boot + Infinispan)中的内存消耗时遇到了一个有趣的问题。 Xmx参数设置为256m,但是Docker监视工具显示的已用内存几乎增加了两倍。” – 分析Docker容器中的Java内存使用情况 。

作者的有趣结论:

“我可以说一个结论吗? 好吧……永远不要在我开玩笑的同一句话中使用“ java”和“ micro”这两个词–请记住,在使用Java,Linux和Docker的情况下处理内存比起初看起来要棘手得多。”

为了跟踪本机内存分配,可以使用特定的JVM选项( -XX:NativeMemoryTracking = summary )。 请注意,如果启用此选项,您将获得5-10%的效果。

在运行时调整JVM内存使用量

减少Java应用程序内存消耗的另一个有用的解决方案是在Java进程运行时动态调整JVM可管理选项。 由于JDK7u60和JDK8u20,选项MinHeapFreeRatioMaxHeapFreeRatio成为可管理的,这意味着我们可以改变在运行时它们的值,而无需重新启动Java进程。

在“ 运行时承诺的堆大小调整”一文中,作者描述了如何通过调整以下可管理选项来减少内存使用:

“…调整大小又花了一个时间,并且堆容量从159MB增加到444MB。 我们描述了至少85%的堆容量应该是可用的,并且这表明JVM调整了堆的大小以获取最多15%的使用率。”

这种方法可以为可变工作负载带来显着的资源使用优化。 改善JVM内存大小的下一步是可以在运行时模式下更改Xmx,而无需重新启动Java进程。

改善内存压缩

在许多情况下,客户希望最大程度地减少Java应用程序中使用的内存量,从而导致产生更频繁的GC。 例如,它可以通过在开发,测试和构建环境以及负载高峰后的生产中更有效地利用资源来帮助节省资金。 但是,根据官方的增强票证 ,当前的GC算法需要多个完整的垃圾回收周期才能释放所有可用的未使用内存。

结果,引入了新的JVM选项( -XX:+ ShrinkHeapInSteps )来调节JDK9中的GC算法行为。 该设置应更改为-XX:-ShrinkHeapInSteps,以禁用4个完整的GC周期。 这样可以更快地释放未使用的RAM资源,并最大程度地减少负载可变的应用程序中Java堆大小的使用。

减少内存使用以加快实时迁移

占用大量内存的Java应用程序的实时迁移需要大量时间。 为了减少总迁移时间和资源开销,迁移引擎应尽量减少主机之间传输的数据。 这可以通过在实时迁移过程之前借助整个GC周期压缩RAM来完成。 对于克服GC周期期间性能下降的情况,这种方法对于各种应用程序而言,与使用未打包的RAM进行迁移相比可能更具成本效益。

我们发现了与该主题相关的出色研究工作: GC辅助Java Server Applications的JVM Live Migration 作者将JVM与CRIU(在用户空间中的Checkpoint / Restore)集成在一起,并引入了一种新的GC逻辑,以减少Java应用程序从一台主机实时迁移到另一台主机的时间。 提供的方法允许在获取Java进程状态的快照之前启用可感知迁移的垃圾收集,然后通过在磁盘上检查点来冻结正在运行的容器,然后从冻结点恢复容器。

另外,Docker社区正在将CRIU集成到主流中。 目前,此功能仍处于试验阶段。

Java和CRIU的组合可以释放仍未发现的性能和部署优化机会,以改善云中Java应用程序的托管。 您可以在“ 容器实时迁移:幕后 ”一文中找到有关容器实时迁移如何在云中工作的更多详细信息。

Java很棒,并且已经在云中(特别是在容器中)很好地工作了,但是我们相信它会更好。 因此,在本文中,我们介绍了一系列当前问题,可以对这些问题进行改进,以平稳高效地运行Java应用程序。

在Jelastic,我们在全球数百个数据中心中运行着数千个Java容器。 良好的内存管理对我们至关重要。 这就是为什么我们不断将有关Java内存的新发现纳入我们的平台的原因,因此开发人员不必明确处理这些问题。 尝试在Jelastic增强平台上运行Java容器 。

翻译自: https://www.javacodegeeks.com/2017/04/java-ram-usage-containers-top-5-tips-not-lose-memory.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

G1垃圾收集器设计目标与改良手段【纯理论】

在之前已经详细对CMS垃圾回收器进行了学习,今天准备要学习另一个全新的垃圾收集器---G1(Garbage First Collector 垃圾优先的收集器),说是一种全新的,其实G1垃圾收集器已经出现了N多年了,只是从发展到成熟是…

centos7安装es mysql_Centos7 安装MySQL详细步骤

Centos7 安装MySQL详细步骤首先在虚拟机中安装一个Centos7(VM虚拟机安装Centos7)1.1 MySQL安装1.1.1 下载wget命令yum -y install wget11.1.2 在线下载mysql安装包wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm11.1.3 安装MySQLrpm -ivh mysql57…

Mac入门--通过homebrew下载过慢问题

使用国内的镜像替换homebrew镜像,对镜像进行加速源 原先我们执行brew命令安装的时候,跟3个仓库地址有关 1 brew.git 2 homebrew-core.git 3 homebrew-bottles 把三个仓库地址全部替换成国内Alibaba提供的地址 1 替换/还原brew.git仓库地址 # 替换成阿里…

在卷积层的运用_Conv 卷积层

onv 卷积层一.why CNN for image ? 1.Some Patterns are much smaller than the whole image.一些模式比起整张图片来说更小,即寻找模式不用看完整的图像。2.The same patterns appear in different regions.同一个模式可能会出现在不同的区域。3.Subsamping the p…

idea 编写javafx_用JavaFX编写图块引擎

idea 编写javafx随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备。 因此,我决定对JavaFX进行更多的游戏编写实验。 这次,我想使用Canvas对渲染进行更多…

C#/.Net操作MongoDBHelper类

先 NuGet两个程序集 1:MongoDB.Driver、 2:MongoDB.Bson namespace ConsoleApp1{ /// <summary> /// MongoDb帮助类 /// </summary> /// <summary> /// MongoDb帮助类 /// </summary> public class DB { private static readonly string connStr &q…

echo回声不能用了_已懂得用电子分频器,为何不继续加个效果器让音响效果更好?...

效果器是一种提供各种声场效果&#xff0c;并对声音信号在时间和频率等多方面多方位进行加工处理以产生特殊音响效果的周边设备&#xff0c;它广泛使用在电台、电视台的节目制作上。然而要充分发挥效果器的作用&#xff0c;使其获得满意的效果&#xff0c;还必须掌握正确的连接…

Spring Web-Flux – Cassandra后端的功能样式

在上一篇文章中&#xff0c;我介绍了Spring Web-Flux的基础知识&#xff0c;它表示Spring框架的Web层中的响应式支持。 我已经展示了使用Spring Data Cassandra并在Spring Web Layers中使用传统注释支持的端到端示例&#xff0c; 大致如下&#xff1a; ... import org.spring…

Mac入门--安装PHP扩展redis,swoole

1 php7以下可以通过pecl安装PHP扩展 安装redis扩展 pecl install redis 安装swoole扩展 pecl install swoole2 PHP7以上通过源码编译安装扩展 2.1 扩展安装包在官网上查找链接地址&#xff1a;http://pecl.php.net 2.2.1 在官网上直接下载上传的服务器上解压 2.2.2 通过wget下载…

商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...

0基础搞懂自动驾驶传统算法与深度学习的鸿沟这个专题核心是要思考如何让rule-base的自动驾驶算法逐步提升为data-driven的算法&#xff0c;从而尽可能的提升软件的泛化性。数据驱动的逻辑代替控制&#xff0c;规划&#xff0c;定位&#xff0c;融合&#xff0c;感知以及替换整个…

1000以内完数c语言程序_C语言经典面试题目及答案详解(二)

接着上次来说&#xff0c;C语言经典面试题目及答案详解&#xff08;一&#xff09;当中大部分是一些概念和理解的东西 &#xff0c;今天说一说实践操作&#xff0c;有关c的经典程序。1、输出9*9口诀。共9行9列&#xff0c;i控制行&#xff0c;j控制列。#include "stdio.h&…

「题解」:[组合数学]:Perm 排列计数

题干&#xff1a; Description称一个1,2,…,N的排列P1,P2…,Pn是Magic的&#xff0c;当且仅当2<i<N时&#xff0c;Pi>Pi/2. 计算1&#xff0c;2&#xff0c;…N的排列中有多少是Magic的&#xff0c;答案可能很大&#xff0c;只能输出模P以后的值Input输入文件的第一行…

最受欢迎的java技术_最受欢迎的Java环境

最受欢迎的java技术该职位将是即将发布的系列文章中的第一篇。 我们从所使用的环境开始&#xff1a;如果您感兴趣的是最受欢迎的JVM供应商或JVM版本&#xff0c;那么32bit是比64bit更流行的体系结构&#xff0c;还是Windows 8比Windows XP更流行的体系结构-这些都将在我们的文章…

DT-06 For MQTT

感谢关注深圳四博智联科技有限公司产品&#xff01;我公司提供完整的WiFi信号强度采集方案&#xff0c;包括WiFi信号采集、设备远程管理平台、智能终端应用等。 Doit_MQTT透传固件基于乐鑫ESP_IOT_SDK使用C编写&#xff0c;代码执行效率高。经过多个版本迭代&#xff0c;可靠性…

@async 没有异步_扒一扒VueCLI3.0中Axios异步请求同步化

前台经常会遇到请求同步和异步的问题&#xff0c;今天咱们来聊一聊vue中同步请求和异步请求那些事儿。说到接口的请求同步和异步问题&#xff0c;最早接触Ajax中就存在&#xff0c;Ajax传递的参数有一个async&#xff0c;默认情况下是false&#xff0c;也就是异步传输的&#x…

Java Platform Module系统中的可选依赖项

Java平台模块系统&#xff08;JPMS&#xff09;对依赖项有很强的见解&#xff1a;默认情况下&#xff0c;需要&#xff08;必须可访问&#xff09;它们&#xff0c;然后在编译时和运行时都将它们存在。 但是&#xff0c;这不适用于可选的依赖项&#xff0c;因为代码是针对运行时…

sqoop导出solr数据_Apache Atlas - 强大的元数据管理工具

构建和安装Apache Atlas构建Apache Atlas下载 Apache Atlas 1.0.0 发行版源码, apache-atlas-1.0.0-sources.tar.gz, 从 downloads 下载. 然后按照以下说明构建Apache Atlas。tar xvfz apache-atlas-1.0.0-sources.tar.gz cd apache-atlas-sources-1.0.0/ export MAVEN_OPTS&qu…

Mac入门--如何使用brew安装多个PHP版本

一 安装7.1 1. 安装PHP7.1 brew install php7.12. 修改配置 php-fpm.conf,一般在/usr/local/etc/php下(如果php-fpm.conf中不存在&#xff0c;则查找php-fpm.d目录) vim php-fpm.conflisten 127.0.0.1:90003. 启动PHP7.1 brew services start php7.14. 这时php-fpm会监听9000端…

python单例模式继承_python单例模式

单例模式是常见的一种设计模式&#xff0c;它是针对类的一种描述&#xff0c;因此&#xff0c;我们可以使用python的decorator来实现通用的单例模式。一.基本的单例模式首先建立我们的decorator。我们需要为classType建立_instance和_lock成员&#xff1a;Pythondef singleton(…

[MEGA DEAL]完整的Java编程训练营(94%)

成为Java Master的10门课程&#xff08;83.5小时&#xff09;&#xff1a;使用JavaFX的设计UI&#xff0c;利用设计模式&#xff0c;Master Multithreading等 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价…