zoukankan      html  css  js  c++  java
  • 记一次生产线程数耗尽,导致内存溢出(outOfMemoryError)问题及解决

    问题:

      数据源连接池线程数最大连接数最初设置300,但是一周有2-3次发生活跃连接数超过最大线程数,导致线程堵塞,服务查询等待超时,所以运维将最大线程数调至1500,这样导致JVM创建的线程数大大增多,原先配置的JVM内存不够使用,导致内存溢出,无法创建线程。

    解决:

      后将最大线程数调至1024,保证不会超过JVM内存限制。

    系统能创建的线程数的计算公式如下:

        (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

        MaxProcessMemory 指的是一个进程的最大内存

        JVMMemory         JVM内存

        ReservedOsMemory  保留的操作系统内存

        ThreadStackSize      线程栈的大小

    例如:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4

      结合上面例子我们来对公式说明一下:
      MaxProcessMemory 在32位的 windows下是 2G
      JVMMemory   eclipse默认启动的程序内存是64M
      ReservedOsMemory  一般是130M左右
      ThreadStackSize 32位 JDK 1.6默认的stacksize 325K左右
    公式如下:
      (2*1024*1024-64*1024-130*1024)/325 = 5841
    公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确)

    由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

    加上下面的JVM参数,测试结果如下:
      ThreadStackSize      JVMMemory                      能创建的线程数
      默认的325K    -Xms1024m -Xmx1024m      i = 2655
      默认的325K    -Xms1224m -Xmx1224m      i = 2072
      默认的325K    -Xms1324m -Xmx1324m      i = 1753
      默认的325K    -Xms1424m -Xmx1424m      i = 1435
      -Xss1024k      -Xms1424m -Xmx1424m      i = 452

    ——————————————————————————————————————————

    内存泄漏导致的堆栈溢出:

    java.lang.OutOfMemoryError: unable to create new native thread
    【问题定位】:
    对于一般的内存泄漏导致的堆栈溢出,通常的错误信息主要有以下几种。
      1. java.lang.OutOfMemoryError: Java heap space
      2. java.lang.OutOfMemoryError: PermGen space
      3. java.lang.OutOfMemoryError: Requested array size exceeds VM limit
      4. java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)

      前两种是程序级别的问题,导致的堆栈溢出。这两种情况必须对代码问题处理解决

    解决此类问题:
      1、 如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。
      2、 如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
      a. MaxProcessMemory 使用64位操作系统
      b. JVMMemory   减少JVMMemory的分配
      c. ThreadStackSize  减小单个线程的栈大小

  • 相关阅读:
    Different AG groups have the exactly same group_id value if the group names are same and the ‘CLUSTER_TYPE = EXTERNAL/NONE’
    An example of polybase for Oracle
    use azure data studio to create external table for oracle
    Missing MSI and MSP files
    You may fail to backup log or restore log after TDE certification/key rotation.
    Password is required when adding a database to AG group if the database has a master key
    Use KTPASS instead of adden to configure mssql.keytab
    ardunio+舵机
    android webview 全屏100%显示图片
    glide 长方形图片显示圆角问题
  • 原文地址:https://www.cnblogs.com/pluto-yang/p/12625592.html
Copyright © 2011-2022 走看看