阿里云 ram 容器镜像_容器中Java RAM的使用:不会丢失内存的5大技巧

阿里云 ram 容器镜像

在本文中,我们希望分享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服务器应用程序的JVM实时迁移 作者将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

阿里云 ram 容器镜像

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

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

相关文章

java堆内存剩余多少合理_Java堆内存的10个要点

我刚开始学习Java编程时,可不知道什么是堆内存或堆空间(heap space),甚至根本不管对象创建时都放在哪里去了。正式了写一些程序后,经常会遇到java.lang.outOfMemoryError等错误,我才开始关注堆内存。对大多数程序员都经历过这样的…

Struts2请求处理的内部流程图/结构图/原理图(版本一)

流程说明: 1.客户端浏览器(Client)向服务器发送一个 http 请求(HttpServletRequest) 2.Container(容器) 通过 web.xml 映射请求,并获得控制器(Controller)的…

java中springdi_java中spring入门

1、spring的概念apache推出的java企业框架,提供了基于ioc的对象工厂、aop面向切面编程等功能及其他增强功能。当前版本4.xxx,支持注解的配置。 springmvc。2、控制反转(ioc):inversion of control。用来描述框架的重要特征spring针对ioc的具体实现&#…

tableau选择计算_干货 | 年薪40W, 掌握Tableau的留学生真的赚翻了

文章来源:UniCareer Tableau作为一款数据分析工具向来被视为文科转行Data必学因为它不需要你有Coding经验而且极易上手那么,Tableau究竟该怎么学?学会Tableau可以胜任哪些岗位?1Tableau: 学到就是赚到Tableau作为一款数据可视化工…

Java Servlet 编程,重定向介绍

文章目录什么是重定向重定向流程演示图如何重定向注意的问题重定向的特点重定向演示什么是重定向 服务器向浏览器发送一个状态码 302 及一个消息头 location,浏览器收到后,会立即向 location 所指向的地址发送请求。 重定向流程演示图 (1&a…

java platform_Java Platform Module系统中的可选依赖项

java platformJava平台模块系统(JPMS)对依赖项有很强的见解:默认情况下,需要它们(可以访问),然后在编译时和运行时都将它们存在。 但是,这不适用于可选的依赖项,因为代码…

hibernate删除记录_Hibernate记录:常见问题的提示和解决方案

hibernate删除记录如何通过适当的日志记录解决一些最常见的Hibernate问题? Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题,而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 …

java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言?在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是,JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完…

pc端游戏修改器_原神:不要吐槽手机内存了,想要获得最佳游戏体验,PC端最合适...

想必大家这段时间都被一个米哈游公司的游戏给刷屏了吧,它就是号称用时三年,斥资一亿美元打造的《原神》,正是这种情况下,原神的关注远远要高于其他游戏,并且玩家的期望值也是和关注度成正比。但是,一经发布…

java调用命令行命令_Java命令行界面(第4部分):命令行

java调用命令行命令我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 “用于解析命令行参数的Java库”,它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样, Commandline使用注释来提供潜在命令行…

JVM 内存示意图(内存结构图/内存解析图)

图 1: 图 2: 图 3: 图 4:

java登录界面命令_Java命令行界面(第8部分):Argparse4j

java登录界面命令Argparse4j是“ Java命令行参数解析器库”,其主页将其描述为“基于Python的argparse模块的Java命令行参数解析器库”。 在本文中,我将简要介绍如何使用Argparse4j 0.7.0处理命令行参数,该参数类似于本系列中的前七篇文章中有…

协议管理模块设计

文章目录协议和合同的区别协议表说明协议签署日志协议和合同的区别 如果协议的内容写得比较明确、具体、详细、齐全,并涉及到违约责任,即使其名称写的是协议,也是合同;如果协议的内容写得比较概括、原则、很不具体,也…

java登录界面命令_Java命令行界面(第7部分):JCommander

java登录界面命令这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高,最受欢迎的库之一: JCommander 。…

java体系技术框架_java框架之Spring 核心框架体系结构

很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下一次创建相同类型的工程时也不知道要配置哪…

IntelliJ IDEA中打开项目时用 Import Project(导入项目) 和 Open(打开项目) 的区别

文章目录创建测试目录使用 Open 方式打开用 Import Project 方式打开用 Open 方式打开文件夹下的多个项目用 Import Project 的方式打开多个项目总结对于 IDEA 中如下图所示的 Import Project 和 Open Project 的区别,一开始不明白怎么回事,网上看了很多…

java命令模式返回值_JAVA 设计模式 命令模式

目录用途命令模式 (Command)将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或请求日志,以及支持可撤销的操作。命令模式是一种行为型模式。结构图-命令模式结构图Command: 用来声明执行操作的接口。abstract…

IntelliJ IDEA for Mac 如何创建普通的Java项目_创建项目_新建项目

文章目录创建 Java 新项目的流程普通 Java 项目结构Java 项目结构特例讲解创建 Java 新项目的流程 Create New Project Empty Project (1)选择【Empty Project】,则项目不会自动创建模块,项目创建成功之后,会自动弹出…

java 集成开发工具_最好的Java开发人员测试和集成工具

java 集成开发工具通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可以对项目的成功产生巨大的影响。 适当的工具使…

aws高额账单_取消堆放以提高延迟并减少AWS账单

aws高额账单大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案(例如从JVM管理的堆中删除某些数据结构)更加复杂。 因此,如果您不熟悉此概念,我建议您继续学习我们最近如何减少…