74. 1、JVM 内部的应用程序请求创建一个新的 Java 线程; 2、JVM native 方法代理了该次请求,并向操作系统请求创建一个 native 线程; 3、操作系统尝试创建一个新的 native 线程,并为其分配内存; 4、如果操作系统的虚拟内存已耗尽,或是受到 32 位进程的地址空间限制,操作系统就会拒绝本次 native 内存分配; 5、JVM 将抛出 java.lang.OutOfMemoryError:Unableto createnewnativethread 错误。 解决方案 1、升级配置,为机器提供更多的内存; 2、降低 Java Heap Space 大小; 3、修复应用程序的线程泄漏问题; 4、限制线程池大小; 5、使用 -Xss 参数减少线程栈的大小; 6、调高 OS 层面的线程最大数:执行 ulimia-a 查看最大线程数限制,使用 ulimit-u xxx 调整最大线程数限制。 ulimit -a .... 省略部分内容 ..... max user processes (-u) 16384 6、Out of swap space? 该错误表示所有可用的虚拟内存已被耗尽。虚拟内存(Virtual Memory)由物理内存(Physical Memory)和交换空间(Swap Space)两部分组成。当运行时程序请求的虚拟内存溢出时就会报 Outof swap space? 错误。 原因分析 该错误出现的常见原因包括以下几类: 1、地址空间不足; 2、物理内存已耗光; 3、应用程序的本地内存泄漏(native leak),例如不断申请本地内存,却不释放。 4、执行 jmap-histo:live<pid> 命令,强制执行 Full GC;如果几次执行后内存明显下降,则基本确认为 Direct ByteBuffer 问题。 解决方案 根据错误原因可以采取如下解决方案: 1、升级地址空间为 64 bit; 2、使用 Arthas 检查是否为 Inflater/Deflater 解压缩问题,如果是,则显式调用 end 方法。 3、Direct ByteBuffer 问题可以通过启动参数 -XX:MaxDirectMemorySize 调低阈值。 4、升级服务器配置/隔离部署,避免争用。
点赞 评论

相关推荐

牛客网
牛客企业服务