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. C# 添加OLE到PPT幻灯片

    本文介绍通过C#程序代码来添加OLE对象到PPT幻灯片的方法.这里以将Excel文档为对象插入到PPT幻灯片中的指定位置:添加时,将Excel中的单元格范围保存为图片,将图片以嵌入的方式添加到幻灯片, ...

  2. 【DevCloud·敏捷智库】如何利用故事点做估算

    背景 在某开发团队辅导的第二天,一个团队负责人咨询道:"领导经常管我要开发计划,我如何能快速的评估出预计开发完成时间呢,我们目前用工时估算,我听说过故事点估算,不知道适合吗?" 问 ...

  3. 知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受

    摘要:通过利用物体类别之间存在的层级关系约束,自动学习从数据中抽取识别不同类别的规则,一方面对模型的预测过程进行解释,另一方面也提供了一条引入人工先验知识的可行途径. 前言 受益于深度学习技术的突破, ...

  4. Angular:都2021年了,你为啥还没用Angular

    摘要:数据绑定是将应用程序UI或用户界面绑定到模型的机制.使用数据绑定,用户将能够使用浏览器来操纵网站上存在的元素. Web开发需要模型和视图之间的数据同步.这些模型基本上包含数据值,而视图则处理用户 ...

  5. 带你掌握Visual Studio Code的格式化程序

    摘要:Visual Studio Code 中的所有语言都可以使用其中一种自动格式化程序进行格式化,并且 Python 扩展还支持 linter. 本文分享自华为云社区<Visual Studi ...

  6. Serverless,引领云计算下一个阶段

    摘要:Serverless将是微服务的"封顶之作",也是推动应用现代化的基石. 本文分享自华为云社区<[深入浅出,Paas之路]华为云.云享专家曹宗南: Serverless ...

  7. Seal梁胜:近水楼台先得月,IT人员应充分利用AI解决问题

    2023年9月2日,由平台工程技术社区与数澈软件Seal联合举办的⌈AIGC时代下的平台工程⌋--2023平台工程技术大会在北京圆满收官.吸引了近300名平台工程爱好者现场参会,超过3000名观众在线 ...

  8. Java 日志框架学习笔记

    日志概念 1. 日志文件 日志文件是用于记录系统操作事件的文件集合 1.1 调试日志 1.2 系统日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...

  9. schedule 定时运行 Python 函数

    安装 pip install schedule 例子 每x分钟运行一次 import schedule import time def job(): print("I'm working.. ...

  10. sqlalchemy 查询已存在表(无model定义)

    已存在的表信息如下,该表不是由sqlalchemy创建.想要对该表做CRUD,可以通过sqlalchemy提供的一个解析方法完成. 示例代码: from sqlalchemy import creat ...