JVM内存配置的再次思考

jvm,内存,配置,再次,思考 · 浏览次数 : 128

小编点评

## JVM内存配置的再次思考摘要 **引言:** * JVM内存分配是一个复杂的问题,需要考虑多个因素。 * Linux 系统对JVM内存配置进行了细致的分析,并提供了一些建议。 **主要配置方面:** * **可分配内存量:** * 可分配给JVM的总内存量。 * 可分配给JVM的堆区内存量。 * 堆区里面老年代、青年代的比率。 * 青年代里面 From区域到区域以及伊甸区的比率。 * 其他区域的内存配置。 * **线程数量:** * 在默认情况下,一个线程占用大于 1MB的内存。 * 针对不同的应用场景,可以设置不同的线程数量。 **配置建议:** * 考虑不同业务需求,选择合适的配置。 * 避免为应用程序提供过多的内存。 * 考虑使用 G1GC 算法,设置适当的停顿时间。 * 在配置过程中,需考虑性能和可用性。 **其他注意事项:** * 容器和虚拟机在限制内存时,可以设置不同的比例。 * 可通过 MaxRamPercentage 设置对堆区的内存限制。 * 调整堆区大小和配置算法对性能的影响。 **总结:** * 理解和配置 JVM内存分配是一个需要精密的技巧。 * 在实际配置中,需要考虑性能、可用性和可扩展性。 * 通过不断的学习和调整,可以优化 JVM 的内存配置。

正文

JVM内存配置的再次思考


摘要

最近研究过不少内存分配相关的处理
今天晚上突然感觉还不是非常系统.
还是想能够细致的在学习一下. 
希望能够慢慢的拾遗,提高自己 

操作系统内存的使用情况

本文主要想思考linux相关的. 
暂时不考虑Windows相关的机器配置.
也不考虑混用的情况 仅考虑专用的应用服务器. 
Linux 尤其是不带GUI界面的纯CLI界面的服务器.
初始内存使用是挺小的.
但是如果机器上面文件比较多,目录比较复杂.
linux会缓存很多inode和dentry信息到内存中
会导致系统内存的大量使用. 

除此之外. 操作系统还会缓存大量最近是用过的文件或者是其他变量
除非是内存遇到压力.一般是不会进行释放. 

最简单的清理这部分文件的方法是:
echo 3 > /proc/sys/vm/drop_caches

JVM内存分配的原则

在给操作系统足够辗转腾挪的空间之后尽可能多的给予JVM使用 
在给JVM的内存需要分析不同的业务场景再进行内存分配. 

JVM内存的设置 主要考虑如下几个方面:
1. 能够分配多少内存给JVM使用
2. 能够分配多少内存给JVM的堆区
3. 堆区里面老年代,青年代的比率.
4. 青年代里面 From区域 to区域 以及伊甸区的比率. 
5. 其他区域的内存配置, 比如方法区,元数据区,以及native memory是否需要进行限制. 

不同业务需要的JVM配置是不一样的.
1. 如果是经常有大对象出现的环境. 可能要增加青年代. 避免对象过大过早升级到老年代触发GC影响性能 
2. 如果对象有很多必须持久化存在的,也就是经理至少15次GC还能够存活的, 需要加大老年代. 避免空间不够,过早出现OOM.
3. 不同架构的元数据区域的类或者是方法的元数据区, 编译方法的codecache可能需要进行定制化分析. 

关于堆区占比的分析

通过nmt的跟踪发现.
在默认情况下一个线程占用大于 1MB的内存, 如下面所示. 
                    Thread (reserved=242MB, committed=242MB)
                            (thread #241)
                            (stack: reserved=241MB, committed=241MB)
                            (malloc=1MB #1210) 
所以这时候要考虑线程数量与内存大小的情况
如果内存过小. 不建议堆区占用太多, 至少要留给操作系统1-2G的内存进行文件缓存等
留给进程数*1MB的用于堆栈区域. 
codecache 一般默认值是 256m
GC进程也需要单独的内存进行存放信息. 一般也是需要跟不小的空间
类的元数据区跟程序的复杂度密切相关, 复杂的可能会有上G的空间占用. 

如果是虚拟机或者是物理机, 感觉排除堆区, 至少留给3.5G左右的空间.
如果是容器化, 可以减少 1.5G 预留2G左右的空间给非堆区. 
容器或者是虚拟机在限制之外的部分可以留给堆区使用. 

注意这里考虑比较复杂的应用, 如果应用比较小巧,可以稍留.
如果应用非常复杂, 建议要增加预留. 避免被系统OOM.

关于MaxRamPercentage

如果容器限制内存是4G左右,系统又比较复杂, 这种情况不建议设置太高的比率
避免超过容器的限制,导致被kill

如果容器的限制内存到了16G或者是更高, 这种情况下. 可以设置为 70%左右的内存给堆区.

如果容器的限制内存超过了32G等, 可以超过 75%的比率给容器使用.

如果更高的内存限制, 可以增加更搞一点的比率. 来最大化性能使用. 

关于堆区大小与性能

性能主要是考虑TPS以及RT
工作线程数/RT=TPS

所以折中情况下. RT是比较关键的.
如果GC时间较久导致RT时间变成性能衰退. 

所以如果设置较大值的内存,会降低GC的次数, 但是可能会导致GC时间的增长
所以选择一个合适的设置和GC算法是很关键的. 

比如G1GC 可以设置 停顿时间来保证响应. 

综上 其实没有银弹可以解决所有问题 需要不断的学习与时间反馈来提高配置. 

与JVM内存配置的再次思考相似的内容:

JVM内存配置的再次思考

JVM内存配置的再次思考 摘要 最近研究过不少内存分配相关的处理 今天晚上突然感觉还不是非常系统. 还是想能够细致的在学习一下. 希望能够慢慢的拾遗,提高自己 操作系统内存的使用情况 本文主要想思考linux相关的. 暂时不考虑Windows相关的机器配置. 也不考虑混用的情况 仅考虑专用的应用服务

一种面向业务配置基于JSF广播定时生效的工具

作者:京东物流 王北永 姚再毅 李振 1 背景 目前,ducc实现了实时近乎所有配置动态生效的场景,但是配置是否实时生效,不能直观展示每个机器上jvm内对象对应的参数是否已变更为准确的值,大部分时候需要查看日志确认是否生效。 2 技术依赖 1)Jsf:京东RPC框架,用作机器之间的通讯工具 2)re

云原生背景下如何配置 JVM 内存

背景 前段时间业务研发反馈说是他的应用内存使用率很高,导致频繁的重启,让我排查下是怎么回事; 在这之前我也没怎么在意过这个问题,正好这次排查分析的过程做一个记录。 首先我查看了监控面板里的 Pod 监控: 发现确实是快满了,而此时去查看应用的 JVM 占用情况却只有30%左右;说明并不是应用内存满了

深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略

首先,我们介绍了Elasticsearch(ES)的倒排索引,这是一种用于快速检索的数据结构。其次,我们了解了ES集群的架构,包括主节点、数据节点和协调节点的功能和作用。然后,我们探讨了中文分词器的选择,其中包括IK、HanLP和Jieba等常用的分词工具。接着,我们解释了写入数据和查询数据的工作原理,包括请求的分配和预处理,数据的存储和查询结果的处理过程。最后,我们讨论了ES部署的优化方法,包括调整JVM内存、分片布局和数量、节点身份设计以及配置Ingest节点等方面的策略。

[转帖]把大象装入货柜里——Java容器内存拆解

https://blog.mygraphql.com/zh/notes/java/native-mem/java-native-mem-case/ 介绍 测试环境 配置容量 POD 容量配置 JVM 容量配置 神秘的 MaxDirectMemorySize 默认值 maxThreadCount 最大

[转帖]jvm学习三-MAT内存分析工具的使用

目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 Dominator Tree 1 模拟内存溢出程序 1.1 jvm配置 -XX:+PrintGCDe

[转帖]jvm一般相关配置OutOfMemoryError关参数配置解释

一般运行java应用都会根据实际情况设置一些jvm相关运行参数 特别是有关内存和oom溢出等参数,方便后续问题定位和解决 如常用的以下配置 nohup java -Xms256m -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps -XX:+Print

[转帖]记录一次spring-boot程序内存泄露排查

现象 spring boot项目jvm启动配置-Xms4g -Xmx4g,然而很不幸的是程序所占的内存越来越高,都达到了12个多G,只能临时重启服务 常用命令 jstat -class PIDjstat -compiler PIDjstat -gc PIDjstat -gccapacity PIDj

JVM GC配置指南

本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正。 #### 1、JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本。 #### 2、如何选择垃圾回收器 响应优先应用:面向C端对响应时间敏感的应用,堆内存8G以上建议选择G1,堆

Java应用堆外内存泄露问题排查

最近有个java应用在做压力测试,压测环境配置:CentOS系统 4核CPU 8g内存 jdk1.6.0_25,jvm配置-server -Xms2048m -Xmx2048m,出现问题,本篇文章是对此次问题的回顾和复盘