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内存配置的再次思考的更多相关文章

  1. JBOSS最大连接数配置和jvm内存配置

    一.调整JBOSS最大连接数. 配置deploy/jboss-web.deployer/server.xml文件 .       <Connector         port="80 ...

  2. jvm内存配置参数

    请看下面题目: 对于jvm内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 其最小内存值和Survior区总大小分别是: a. 51 ...

  3. JVM内存配置参数-XMX,-XMS,-XMN的例子

    转载:http://www.nowcoder.com/questionTerminal/093bfa948d144ce3b0a68b938ae8b4ec 对于JVM内存配置参数: -Xmx10240m ...

  4. JVM内存配置详解

    前段时间在一个项目的性能测试中又发生了一次OOM(Out of swap sapce),情形和以前网店版的那次差不多,比上次更奇怪的是,此次搞了几天之后啥都没调整系统就自动好了,死活没法再重现之前的O ...

  5. JVM内存配置详解(转)

    前段时间在一个项目的性能测试中又发生了一次OOM(Out of swap sapce),情形和以前网店版的那次差不多,比上次更奇怪的是,此次搞了几天之后啥都没调整系统就自动好了,死活没法再重现之前的O ...

  6. JVM内存配置

    JVM内存主要分为两个部分,分别是PermanentSapce和HeapSpace. PermantSpace主要负责存放加载的Class类级对象如class本身,method,field等反射对象, ...

  7. JVM内存管理的一些思考

    目录 一. 内存是怎么分配的 二. 方法区 三. java对象的生命周期 四. Class对象是在方法区还是堆中 五.java对象的大小 六. 类加载的初始化阶段 七.Class.forName和Cl ...

  8. tomcat JVM内存 配置

    原文:http://elf8848.iteye.com/blog/467460 常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java ...

  9. 一定要记住的14个JVM内存配置参数

    jvm setting的参数确实比较多(Oracle官网Java HotSpot VM Options),但是作为一名java开发者,那几个最常用最基本的参数设置和意义一定要死记和理解.这里推荐一个网 ...

  10. Docker——Tomcat JVM 内存配置

    前言 安装再docker中的tomcat,在下载大文件或者某些情况下,会出现tomcat的内存溢出等情况,所以需要配置tomcat的内存大小,docker中的tomcat内存大小配置有四种方式. 一. ...

随机推荐

  1. Redis核心技术与实战

    最近在读一篇关于Redis的专栏,叫做<Redis核心技术与实战>,作者在Redis方面研究颇深,读后非常受益,特在此做记录. 一.Redis基础 1)知识图和问题画像图 Redis知识全 ...

  2. 华为扫地僧:揭秘IoT+鸿蒙帮助企业突围物联网安全问题

    摘要:通过介绍物联网安全架构以及华为云IoT+鸿蒙端边云协同安全实践,意在通过华为云IoT+鸿蒙帮助企业解决物联网安全问题. 在本期#码出未来,与你同行#HDC.Cloud2023华为云开发者社区系列 ...

  3. 百万奖池角逐,华为云IoT边缘带你看懂“边缘计算开发者大赛”

    摘要:2022年9月1日,第二届边缘计算开发者大赛正式启动. 2022年9月1日,第二届边缘计算开发者大赛正式启动! 本届大赛由华为云参与承办,中国信息通信研究院.工业互联网产业联盟.边缘计算产业联盟 ...

  4. 13个VSCode使用技巧,开启高效的开发模式

    摘要:VsCode是一款开源的编辑器,拥有强大的功能,.由于拥有各种各样的插件,这就使得VsCode可以做到的事情更多了.在使用的过程中,也是有很多技巧的,掌握一些技巧对于后期写代码也会轻松很多. 本 ...

  5. 火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 在企业竞争加剧的今天,精益开发和敏捷迭代已成为产品重要的竞争力.如何保障每一次 Feature 高效迭代与安全,如何快速实 ...

  6. 分享个本地maven配置

    用阿里云的快有点受不了了,经常有包下载不了 settings.xml <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0&q ...

  7. Linux 创建新用户

    添加用户组[root@VipSoft ~]#groupadd admin 添加用户[root@VipSoft ~]#useradd jimmy -m -d /home/jimmy -g admin 修 ...

  8. 简洁好用的python-pip包更新工具

    今天推荐一个github的开源工具 pkgu,支持以表格形式展示当前python环境下的有新版本的package的版本信息,并支持全部或部分更新这些已经过期或者有新版的库. 该工具目前还提供了 cac ...

  9. Python网络编程:ZeroMQ

    大家好,我是老胡.最近在和小伙伴们一起搞事情,我是学统计出身,编程能力其实很差,有点拖后腿了.所以需要恶补基础,这个系列会更新几篇,感兴趣的同学可以一起学习交流. ZeroMQ概述 ZeroMQ(又名 ...

  10. SSL 证书变革之时已至,这些变化你都清楚吗?

    现代社会最离不开的是"安全",无论是生命.财产.数据还是其他任何事物都需要各种手段来保证安全,互联网自然也无法免俗.HTTP 协议作为无法加密数据,让所有通信数据都在网络中明文&q ...