对于想了解在Openjdk8中如何合理使用容器memory资源的读者,本文将提供新的信息,我们将详细介绍openjdkplatformbinary占用高,并且为您提供关于Centos7安装Oracle
对于想了解在Openjdk 8 中如何合理使用容器 memory 资源的读者,本文将提供新的信息,我们将详细介绍openjdkplatformbinary占用高,并且为您提供关于Centos7 安装Oracle JDK1.8和OpenJDK 1.8、CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案、Druid在OpenJDK下的问题、java – 如何/在哪里下载openjdk / openjre for windows [复制]的有价值信息。
本文目录一览:- 在Openjdk 8 中如何合理使用容器 memory 资源(openjdkplatformbinary占用高)
- Centos7 安装Oracle JDK1.8和OpenJDK 1.8
- CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案
- Druid在OpenJDK下的问题
- java – 如何/在哪里下载openjdk / openjre for windows [复制]
在Openjdk 8 中如何合理使用容器 memory 资源(openjdkplatformbinary占用高)
前言
将 Java 应用容器化虽然更好地解决了可移植性问题,但也存在着一些不友好的情况,比如低版本的JDK(低于Java 8u131)并不能识别 CGroup 资源限制。这将导致JVM读取的是宿主机的全部CPU和内存,一但容器使用资源超过限制则会被 docker 杀死。
在 kubernetes 中,我们会显示在 yaml 文件中配置CPU、内存请求和限制,我们希望容器中的JVM进程能够自动识别到 CGroup 资源限制,获取到正确的内存和CPU信息从而自行动态调整。
JVM 参数配置
以下操作皆在一台 4C 16G 服务器上进行。
版本低于 8u131
JDK 版本低于 8u131 版本的 JVM 不会自动识别到 CGroup 资源限制,需要手动设置初始堆大小以及最大堆大小,否则会按照宿主机的全部内存设置默认值:
- 配置最大堆大小
-Xmx
,默认值:内存的1/4 -
配置初始堆大小
-Xms
,默认值:内存的1/64
未配置JVM参数
可以看到 Max. Heap Size (Estimated): 3.48G
,未能正确识别 CGroup 资源限制
$ docker run --rm -m 2GB openjdk:8u121-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 3.48G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (IcedTea 3.3.0) (Alpine 8.121.13-r0)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
配置JVM参数
配置 -Xmx
和 -Xms
后即可达到我们想要的结果
$ docker run --rm -m 2GB openjdk:8u121-alpine java -XshowSettings:vm -Xmx2000m -Xms2000m -version
VM settings:
Min. Heap Size: 1.95G
Max. Heap Size: 1.95G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (IcedTea 3.3.0) (Alpine 8.121.13-r0)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
8u131 及以上版本
从 8u131 版本开始支持 UseCGroupMemoryLimitForHeap
和 MaxRAMFraction
这两个选项,用 CGroupMemory
的大小作为 JVM heap size,MAXRAMFraction
是用来控制实际可用的内存数量的,比如设置为 1 的话就是 CGroupMemoryLimit
的全部,设置为 2 的话一半,3 的话就是 1/3,以此类推
|MaxRAMFraction取值|堆占比|容器内存=1G|容器内存=2G|容器内存=4G|容器内存=8G|容器内存=16G| |:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-| |1|≈90%|910.50M|1.78G|3.56G|7.11G|14.22G| |2|≈50%|455.50M|910.50M|1.78G|3.56G|7.11G| |3|≈33%|304.00M|608.00M|1.19G|2.37G|4.74G| |4|≈25%|228.00M|455.50M|910.50M|1.78G|3.56G|
未配置JVM参数
可以看到 Max. Heap Size (Estimated): 3.48G
,未能正确识别 CGroup 资源限制
$ docker run --rm -m 2GB openjdk:8u131-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 3.48G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (IcedTea 3.4.0) (Alpine 8.131.11-r2)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
配置JVM参数
配置 -XX:+UnlockExperimentalVMOptions
、-XX:+UseCGroupMemoryLimitForHeap
和 -XX:MaxRAMFraction=1
后即可达到我们想要的结果
$ docker run --rm -m 2GB openjdk:8u131-alpine java -XshowSettings:vm -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -version
VM settings:
Max. Heap Size (Estimated): 1.78G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (IcedTea 3.4.0) (Alpine 8.131.11-r2)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
8u191 及以上版本
从 8u191 开始引入了 java10+ 上的 UseContainerSupport
选项,而且是默认启用的,不用设置。同时 UseCGroupMemoryLimitForHeap
这个就弃用了,不建议继续使用,同时还可以通过 -XX:InitialRAMPercentage
、-XX:MaxRAMPercentage
、-XX:MinRAMPercentage
这些参数更加细腻的控制 JVM 使用的内存比率。比如一些 Java 程序在运行时会调用外部进程、申请 Native Memory 等,所以即使是在容器中运行 Java 程序,也得预留一些内存给系统的。所以 -XX:MaxRAMPercentage
不能配置得太大。
未配置JVM参数
可以看到未添加任何 JVM 参数即可正确识别到 CGroup 资源限制
$ docker run --rm -m 2GB openjdk:8u191-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 455.50M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
配置JVM参数
- 使用
-XX:MaxRAMFraction
参数调整Max. Heap Size
大小 ```console $ docker run –rm -m 2GB openjdk:8u191-alpine java -XX:MaxRAMFraction=1 -XshowSettings:vm -version
VM settings: Max. Heap Size (Estimated): 1.78G Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM
openjdk version “1.8.0_191” OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
* 使用 `-XX:InitialRAMPercentage`、`-XX:MaxRAMPercentage`、`-XX:MinRAMPercentage` 参数更加细腻的控制 JVM 使用的内存比率
```console
$ docker run --rm -m 2GB openjdk:8u191-alpine java -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=90.0 -XX:MinRAMPercentage=50.0 -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 1.60G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
参考资料
- http://www.51gjie.com/java/551.html
- https://zhuanlan.zhihu.com/p/140849800
- https://my.oschina.net/neverforget/blog/4779579
- https://sevenyu.top/2019/04/01/java-resources-limit.html
- https://qingmu.io/2018/12/17/How-to-securely-limit-JVM-resources-in-a-container/
本文由猪齿鱼技术团队原创,转载请注明出处:猪齿鱼官网
关于猪齿鱼
猪齿鱼Choerodon全场景效能平台,提供体系化方法论和协作、测试、DevOps及容器工具,帮助企业拉通需求、设计、开发、部署、测试和运营流程,一站式提高管理效率和质量。从团队协同到DevOps工具链、从平台工具到体系化方法论,猪齿鱼全面满足协同管理与工程效率需求,贯穿端到端全流程,助力团队效能更快更强更稳定。戳此处试用猪齿鱼
Centos7 安装Oracle JDK1.8和OpenJDK 1.8
首先:Oracle JDK
和OpenJDK
装任何一个就可以了.
Oracle JDK和OpenJDK的区别:
Oracle JDK由Oracle公司开发,该公司是Sun许可证,基于Java标准版规范实现。它以二进制产品的形式发布。它支持多种操作系统,如Windows,Linux,Solaris,MacOS等。它支持不同的平台,如Intel 32位和64位架构,ARM架构和SPARC。它完全基于Java编程语言。之后,该许可证宣布将根据GPL(通用公共许可证)许可证发布。Oracle JDK包含许多组件作为库形式的编程工具集合OpenJDK是Java SE平台版的开源和免费实现,它是Sun Corporation(现在的Oracle Corporation)于2006年开始的开发结果。它是根据GNU GPL许可证授权的。它最初于2007年发布。它由Oracle Corporation,Red Hat,IBM,Apple Inc.,OpenJDK和Java Community等开发。它是使用C ++和Java编程语言编写的。它支持不同的操作系统,如FreeBSD,Linux,Microsoft Windows,Mac OS X. OpenJDK是Java SE Platform Edition的官方参考实现。
Oracle与OpenJDK之间比较 | Oracle JDK | OpenJDK |
---|---|---|
执照 | 它是根据GPL(通用公共许可证)许可证授权的 | 它是根据GNU GPL(通用公共许可证)许可证授权的 |
发展 | 由Sun Microsystems Inc.开发 | 由Oracle,OpenJDK和Java社区开发 |
性能 | 根据Sun JDK的开发和实现提供性能 | 提供由Oracle JDK之上的一些供应商开发的高性能 |
可扩展性 | 根据Sun的实施 | 可以使用其他库或Oracle JDK进行改进 |
费用 | Sun的官方执行许可证 | 开源和免费实施可供免费使用 |
速度 | 由Sun Microsystems Inc.开发 | 第三方供应商将通过进行一些调整来提高JVM的速度 |
操作系统 | 支持Windows,Linux,Solaris,MacOS | FreeBSD,Linux,Microsoft Windows,Mac OS X. |
便于使用 | 可以与任何应用程序开发一起使用 | 可以与任何应用程序开发和其他开源工具一起使用,以提高开源实现模型的性能。 |
Oracle JDK1.8的安装
1.下载 jdk-8u261-linux-x64.tar.gz
链接: https://pan.baidu.com/s/1_x5W... 密码: 6pat
2.创建目录
# 把 jdk-8u261-linux-x64.tar.gz通过ftp传送到Centos7服务器
> mkdir /usr/local/java
> tar -xzvf jdk-8u261-linux-x64.tar.gz -C /usr/local/java
> mv /usr/local/java/jdk1.8.0_261 /usr/local/java/jdk1.8
3.配置环境变量
> vi /etc/profile
# 添加JAVA_HOME环境变量到文件末尾
export JAVA_HOME=/usr/local/java/jdk1.8
export PATH=${JAVA_HOME}/bin:${PATH}
> source /etc/profile
4.测试
> java -version
Open JDK1.8的安装
1.查看jdk1.8可用版本
> yum -y list java-1.8*
2.安装Open JDK1.8
> yum install java-1.8* -y
3.查看Open JDK1.8安装路径
> rpm -qa | grep openjdk
java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-devel-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-headless-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-demo-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-src-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-javadoc-zip-1.8.0.262.b10-0.el7_8.noarch
java-1.8.0-openjdk-accessibility-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-javadoc-1.8.0.262.b10-0.el7_8.noarch
> rpm -ql java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64-policytool.desktop
/usr/share/icons/hicolor/16x16/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/24x24/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/32x32/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/48x48/apps/java-1.8.0-openjdk.png
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
为Open JDK1.8的安装路径
4.配置环境变量
> vi /etc/profile
# 添加JAVA_HOME环境变量到文件末尾
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
export PATH=${JAVA_HOME}/bin:${PATH}
5.测试
> java -version
CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案
原创作品。转载请注明出处
PS:由于图片是安装后进行截图所以出现的是1.8版本,步骤是完全正确的。
一、检测JDK
首先你要打开终端,为避免可能出现的权限问题建议直接su进入root。
然后输入查看你centOS系统是否自带JDK,如果没有你就可以直接进行安装了,否者还需要有卸载步骤。
如果系统自带JDK,则输入 和进行查看JDK版本。
(PS:被网上的一些卸载方案弄乱了,把tzdata-java-2013g-1.el6.noarch也直接nodeps了,结果发现用yum卸载才要remove,但是结果无影响所以也就不了了之了T_T)
1.先卸载旧的JDK,再安装新的JDK
2.先安装新的JDK,在卸载旧的JDK
网上说第二种安装方案比较好,但是由于本人是按方案1安装,也没出现什么问题。
二、卸载JDK
在有2种方案:
1.使用 rpm -e --nodeps进行强制卸载
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
2.使用 yum -y remove进行卸载
- 查看CentOS自带JDK是否已安装。
◆输入:。
Druid在OpenJDK下的问题
本机用的Oracle JDK1.8,运行druid连接mysql没问题,其中设置了userCallback和passwordCallback来对用户名和密码加密,运行时解密。在win上运行没问题,在新安装的CentOS下,运行时报错,显示错误是:
Caused by: java.sql.SQLException: Access denied for user ''180C1AD83CA4F0C8E7D27294BBB97A1D''@''10.95.68.98'' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
加密的用户名没解密,估计是userCallback没生效,去看了代码,没问题呀,首先就kao虑环境问题,linux上是openjdk,版本是1.7.0,首先上传了一个oracle jdk rpm包,rpm安装了,默认JDK切换为安装的,再执行,所以数据库连接就正确了。
估计是openjdk缺少包,导致callback类无法执行。
java – 如何/在哪里下载openjdk / openjre for windows [复制]
参见英文答案 > OpenJDK availability for Windows OS 10个
如何下载适用于Windows的OpenJDK和OpenJRE?
是否有Open JRE的服务器版本?
我问的原因是因为谷歌搜索没有让我到任何地方.由于越来越多的公司开始关注openjdk / openjre,我们中的一些人需要在Windows上部署/开发,这是一个有效的问题.
如果你认为构建open jdk / jre是目前唯一的解决方案,请等一下.这样说的.
全部:这不是重复.自从提出原始问题(以及相应的答案)以来,JDK 8已经发布. OpenJDK站点没有OpenJDK 8或OpenJRE 8二进制文件. java开发人员很难为自己构建一个.我正在寻找一个“官方”OpenJDK,客户端OpenJRE,服务器OpenJRE,我可以根据许可证下载和重新分发.
How do I go about downloading OpenJDK and OpenJRE for Windows ?
在OpenJDK主页上,它说明了
Download and install the open-source JDK 8 for most popular Linux distributions. If you came here looking for Oracle JDK 8 product binaries for Solaris,Linux,Mac OS X,or Windows,which are based largely on the same code,you can download them from java.oracle.com.
您可以像其他人一样自己下载和构建OpenJDK,但是我不确定这对于生产实例是个好主意,它是一个非常复杂的构建和测试产品.
Is there a Server version of Open JRE ?
是的,服务器JVM默认在Linux和64位窗口上运行.
If you think building the open jdk/jre is the only solution for Now
还有很多其他免费的JDK,包括Oracle和IBM
如果你需要支持我建议考虑Azul的Zulu.
我们今天的关于在Openjdk 8 中如何合理使用容器 memory 资源和openjdkplatformbinary占用高的分享已经告一段落,感谢您的关注,如果您想了解更多关于Centos7 安装Oracle JDK1.8和OpenJDK 1.8、CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案、Druid在OpenJDK下的问题、java – 如何/在哪里下载openjdk / openjre for windows [复制]的相关信息,请在本站查询。
本文标签: