短短几年内,容器就改变了软件行业的面貌。也许您已经到了在容器中运行Java的地步。那很棒!不幸的是,关于容器化Java应用程序的CPU和内存使用率,还有一些事情要注意,我将在下面概述。

本文假定总体上熟悉Java和容器。如果您需要更多背景知识,请查看部分(或全部)参考资料。

Heap Space

如果有一个关于在容器中运行Java的关键声明,则为以下内容:

不要为在容器中运行的任何JAVA程序手动设置JVM堆空间。相反的是,设置容器限制。

为什么?

首先,设置容器限制可以实现容器(cgroups)的最基本目标,即隔离进程集合的资源使用。例如,当您通过JVM参数手动分配堆空间时,您完全忽视了容器的限制。

它允许轻松调整容器资源分配。需要更多内存吗?达到容器极限。需要更少吗?缩小尺寸。这为自动处理相应地扩展容器(例如k8s垂直容器自动缩放器)打开了大门,而无需手动调整JVM参数。

如果在容器编排环境(例如Kubernetes)中运行,则容器限制对于节点运行状况和调度都将变得极为重要。调度程序将使用这些限制来找到合适的节点来运行容器,并确保相等的负载分布在各个节点上。如果通过JVM参数设置内存使用率,则此信息对于调度程序不可用,因此调度程序不知道如何有效地分散容器的负载。

如果未设置容器限制,并且Java在没有显式设置任何JVM内存标志的容器中运行,则JVM会自动将最大堆设置为运行它的节点上RAM的25%。例如,如果您的容器在64 GB的节点上运行,则JVM进程堆空间可以最大为16 GB。如果您在一个节点上运行10个容器(由于自动扩展,这种情况很常见),那么您突然会急需160 GB的RAM。这是一场随时可能发生的灾难。

你能为这个做什么?

设置容器内存(和CPU)限制。仅依靠资源请求(软限制)是不够的。软限制非常适合帮助调度程序,但是设置硬限制可以使Docker(或您使用的任何容器运行时)分配指定的资源给容器本身,而不再分配更多资源。这也将允许Java(从Java 8u191开始默认为“容器感知”)根据放置在容器本身上的资源限制(而不是容器正在运行的节点)正确分配内存。

关于[Min | Max | Initial] RAMPercentage参数

在较新的Java版本中,引入了以下JVM参数(并将其反向移植到Java 8u191)。

-XX:MinRAMPercentage

-XX:MaxRAMPercentage

-XX:InitialRAMPercentage

我不会详细介绍它们是如何工作的,但是关键要点在于它们可以用于微调JVM堆大小,而无需直接设置堆大小。也就是说,容器仍然可以依靠施加在其上的限制。

那么使用什么正确的值呢?答案是-“取决于”……尤其是对容器施加的限制。

默认情况下,JVM堆获取容器内存的25%。您可以调整初始/最小/最大堆参数来更改此…例如设置-XX:MaxRAMPercentage = 50将允许JVM为堆消耗50%的容器内存,而不是默认的25%。什么时候安全,很大程度上取决于容器必须使用多少内存以及容器中正在运行哪些进程。

例如,如果您的容器正在运行一个Java进程,并为其分配了4 GB的RAM,并且您设置了-XX:MaxRAMPercentage = 50,则JVM堆将获得2 GB。这与通常会获得的1 GB默认值相反。在这种情况下,几乎可以肯定50%是绝对安全的,甚至是最佳的,因为许多可用RAM可能未得到充分利用。但是,假设同一容器仅分配了512 MB RAM。现在设置-XX:MaxRAMPercentage = 50将为堆提供256 MB的RAM,而仅将其余256 MB留给整个容器的其余部分。该内存将需要由容器中运行的所有其他进程以及JVM Metaspace / PermGen等分配共享。在这种情况下,也许50%不太安全。

因此,我提一下几点建议:

除非您想为Java进程压缩一些额外的内存空间,否则不要触摸这些参数。在大多数情况下,25%的默认值是管理内存的安全方法。它可能不是最有效的内存使用方法,但是RAM很便宜,因此最好还是谨慎一点,而不是出于某些未知原因而使JVM进程被OOM杀死。

如果您确实想调整这些,请保守一点。 50%最有可能是一个安全值,可以在大多数情况下避免出现问题,但是,这仍然很大程度上取决于容器的大小(从内存角度)。我不建议您将其设置为75%,除非您的容器具有至少512 MB的RAM(最好是1 GB),并且您对相关应用程序的内存使用情况有很好的了解。

如果您的容器除Java外还运行多个进程,请在调整这些值时格外小心。容器内存在所有这些进程之间共享,并且在这些情况下了解容器的总体使用情况更为复杂。

超过90%的人都可能会自找麻烦。

那Metaspace / PermGen / etc呢?

这超出了本文的范围,但请放心,也可以对此进行调整,但可能不应该这样做。默认的JVM行为适用于大多数用例。如果您发现自己试图解决一个晦涩的内存问题,那么可能是时候考虑摆弄JVM内存这个有些深奥的领域了,但是否则我将避免直接做任何事情。

CPU哪?

这里没什么可做的。从Java 8u191开始,JVM默认情况下是“容器感知”的,并且可以正确解释CPU份额分配。尽管有一些细节值得我们理解,所以除了在这里概述之外,我将指导您阅读这篇出色的文章,详细说明所有这些。

总结

现代Java非常适合在容器环境中运行,但是每个人都应该知道一些不太明显的细节,以确保他们从应用程序中获得最佳性能。我希望这里提供的信息以及出色的参考资料可以帮助您实现这一目标。

java cpu分配_容器中的Java:资源分配准则相关推荐

  1. java cpu模拟器_这是在JAVA中实现6502 CPU模拟器的“好”方法吗?

    想要确保我不必回去并重做大块代码......我将每个操作码都作为实现Runnable的枚举中的值.有没有更有效的方法,我应该这样做,还是我在写轨道上准确地运行测试套件?这是在JAVA中实现6502 C ...

  2. java future用法_纯干货:Java学习过程中的21个知识点和技术点

    我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...

  3. docker 运行java程序_Docker:在容器中运行Java应用程序

    您可以使用Docker在特定的运行时环境中运行容器中的Java应用程序.本教程介绍如何创建Dockerfile,以便在OpenJDK 8的容器中运行简单的Java应用程序. 示例应用程序由一个Main ...

  4. java cpu监控_如何在Java中监视计算机的CPU,内存和磁盘使用情况?

    问题 我想用Java监视以下系统信息: 当前CPU使用率**(百分比) 可用内存*(免费/总计) 可用磁盘空间(空闲/总计)*请注意,我的意思是整个系统可用的总内存,而不仅仅是JVM. 我正在寻找一种 ...

  5. java se 动态添加视图组件_博为峰Java技术题 ——JavaSE Java Swing在顶层容器中添加菜单栏Ⅰ...

    下面将讲述如何在顶层容器中添加菜单栏.下面将通过编写一段Swing程序代码来讲解如何在顶层容器中添加菜单栏.其代码如下: publicclassBWFSwingMenu { staticintwidt ...

  6. java 容器限制大小,容器中的Java与内存限制:LXC、Docker与OpenVZ

    开发者在使用JVM.内存与Docker时是否遭遇到难题?今天我们将一同利用Jelastic将其解决.最近Matt Willaims提起的Docker内Java及其内存限制的议题得到了广泛关注,而这些在 ...

  7. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

  8. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  9. 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)

    操作系统 [root@Optimus /]# uname -a Linux Optimus 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2 ...

最新文章

  1. android实现长截屏,Android实现全屏截图或长截屏功能
  2. Java中的注解到底是如何工作的?
  3. Broadcast Receiver广播接收器
  4. python-docx官方声明
  5. php 如何启动ica文件,IE11打开ICA文件时无法直接调用Citrix Receiver?
  6. 攻防世界-Misc-_Aesop_secret
  7. C#Socket开发TCP详解(二)
  8. 《复杂》读书笔记(part7)--遗传算法
  9. renderthread是什么_Android5.0中 hwui 中 RenderThread 工作流程
  10. GitRepo 命令大全 ***
  11. 数据库安全问题?这里有10个最常见的
  12. Transactional replication-如何跳过一个事务
  13. Dell服务器误删阵列恢复操作
  14. 某商场TD-LTE室内覆盖规划
  15. 如何将WORD转换成EXCEL
  16. 小习题:猴子吃桃问题
  17. 2020年11月4日
  18. 知乎zhihu:Python爬取某个问题下所有含有给定关键词的回答
  19. 计算机的发明还不到一百年 英语,考研英语作文万能句子25个.doc
  20. MySQL--eq_range_index_dive_limit参数学习,MYSQL 5.6 5.7处理数据分布不均的问题

热门文章

  1. 斯坦福CS231n李飞飞计算机视觉之线性分类上
  2. 守住一份平淡,宁静坦然,不浮不躁
  3. 当面试官问Webpack的时候他想知道什么
  4. Swagger2生成在线接口文档并导出pdf文件
  5. 记一次物理服务器磁盘故障修复过程
  6. 女生学Java好学吗?适合学习吗?
  7. 全选和反选的效果怎么做?
  8. android手机版本
  9. pantum打印机驱动安装m6506_一键完成 驱动轻松装_奔图 M6506NW_办公打印评测试用-中关村在线...
  10. 高项-信息系统项目管理师-重要考点