• 常见的 由于未调整服务器 ulimit 而引起的内存溢出问题


     
    本篇共引起三个问题:
    1、ulimit 的调整(否则将默认进程只能创建1024个线程)
    2、XSS配置的说明(默认线程为1M,此处配置XSS线程所占用内存为246K)
    3、 线程所占用的内存为堆外内存(相比大家也都知晓该问题,本篇也是因为服务内存不足,调整Ulimit后还是存在oom的问题,而最终引起并说明下该线程堆外的问题)
     
     
    注意:(java中每实例化一个线程,则是向操作系统服务器请求实例化一个本地内存,并非是直接使用的JVM中所配置的堆的内存的大小,,需注意,)
    在直接使用线上内存分析时,曾出现类似的一个问题是这样的,
    线上服务器共8G内存,通过 ps -ef|grep java,可以查看共部署了3台服务,
    前两台robot服务,分别配置Xms为2G,我们的core设置JVM参数为-Xms为3G,
    此时则已经吃掉了7G的内存,除去服务器自身再吃掉500M内存,那么此时可供使用的内存仅有
    500M左右,而此时服务器频繁报错异常则为,
     
    不能够创建新的本地线程,最初时怀疑是 linux 服务器所设置的进程可开启线程数较少的原因,查看ulimit -a 发现,服务器的确没有被优化过,默认ulimit -u的参数值为1024,即的确没有调整过linux服务器的最大线程创建数的值,    
          此时通过linux -u调整参数为 10240,在已有的可创建线程数量上乘以10,需要提及一下(此时的,JVM针对单个线程的堆栈占用内存此时配置的是246K,线程所设置的占用内存较小,则
          可以保证所创建的线程的数量越多,这是ok的)
          此时在设置了ulimit参数后,过了一天,重复出现了,本地线程创建失败,内存异常的提示,此时则确认原因为:java线程在实例化创建时,是向服务器操作系统申请内存进行线程的创建,并非是使用的JVM所配置的堆的内存空间进行创建,所以此时问题已经可以很明显了,服务器基本还剩余的500M内存,是不够线程的创建数量的,并且是部署了三个项目的情况下,分别开了三个容器Jetty,
          三个项目同时运行,所开启的线程数,必然是500M内存,所不够的,所以此时的解决方式则是,
           1.申请增加服务器内存,
          2. 重新调整三个容器中JVM的配置参数,
    即调小JVM的堆的内存配置,剩余出较多的服务器内存,用于创建线程时使用,调整了-Xms和-Xmx的堆内存配置,
    当然,既然已经调整了Xmx堆的内存配置,则同步也调整了年轻代,Xmn的配置,
    此处我们的配置比例基本为3:1,即堆内存和年轻代的设置比例
     

  • 相关阅读:
    java中判断文件存在与否
    crontab安装以及定时任务的执行
    su命令学习
    linux中如何查看哪些用户允许登录
    linux中的压缩文件的格式
    R语言学习(瑞士军刀)
    linux下mysql导入导出sql文件
    创建线程池的7种方法
    docker运行tomcat
    Docker之镜像
  • 原文地址:https://www.cnblogs.com/zh94/p/11923190.html
Copyright © 2020-2023  润新知