Java3种错误_java中三种常见内存溢出错误的处理方法

相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。

在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域,Class需要存储的内容主要包括方法和静态属性。堆区域用来存放Class的实例(即对象),对象需要存储的内容主要是非静态属性。每次用new创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被jvm的垃圾回收机制管理。而Java栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。Java程序的每个线程中都有一个独立的堆栈。容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。

第一种OutOfMemoryError: PermGen space

发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:

增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行: JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m" 如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。

清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。

第二种OutOfMemoryError:  Java heap space

发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:

检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。 我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。

增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

第三种OutOfMemoryError:unable to create new native thread

在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。

那么是什么原因造成这种问题呢?

每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。

给出一个有关能够创建线程的最大个数的估算公式:

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

对于jdk1.5而言,假设操作系统保留120M内存:

1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads

1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

对于栈大小为256KB的jdk1.4而言,

1.5GB allocated to JVM: ~1520 threads

1.0GB allocated to JVM: ~3520 threads

对于这个异常我们首先需要判断下,发生内存溢出时进程中到底都有什么样的线程,这些线程是否是应该存在的,是否可以通过优化来降低线程数; 另外一方面默认情况下java为每个线程分配的栈内存大小是1M,通常情况下,这1M的栈内存空间是足足够用了,因为在通常在栈上存放的只是基础类型的数据或者对象的引用,这些东西都不会占据太大的内存, 我们可以通过调整jvm参数,降低为每个线程分配的栈内存大小来解决问题,例如在jvm参数中添加-Xss128k将线程栈内存大小设置为128k。

性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出、FullGC频繁检测手段-总结与分享 含义:内层溢出通俗理解就是内存不够,程序要求的内存超出了系统所能分配的范围。危害:内存溢出错误会导致处理数据的任务失败,甚至会引发平台崩溃等严重后果。应用程序CPU使用率高,甚至超过100%死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。Java 里的 StackOverflowError。抛出这个错误表明应用程序因为深递归导致栈被耗尽了。 阅读详情

相关推荐

Java内存溢出问题及解决方案

在编写代码时,应该注意及时释放资源、避免加载不必要的对象,并合理管理缓存,以充分利用可用内存并提高程序的性能。过度使用缓存:缓存可以提高程序的性能,但如果缓存设计不当或者没有正确管理缓存的大小,就可能导致内存溢出。例如,缓存中存储了大量的对象,而缓存的大小没有限制,这将导致内存不断增长。内存泄漏(Memory Leaks):当程序中的对象不再使用时,没有正确释放对它们的引用,导致这些对象无法被垃圾回收器回收。例如,将大量数据加载到内存中,但只使用其中一小部分数据,而没有及时释放未使用的部分。

2301_79326510的博客 864

多线程即内存溢出处理方式

一、什么是多线程 二、多线程的创建方式 三、为什么使用线程池 四、内存溢出怎么办 OOM:OutOfMemory(内存溢出) 开发中常见异常: 1.StackOverFlowError 实例:递归调用后方法特别多,将栈空间撑爆 public class StackOverFlowErrorDemo{ public static void main(){ test(); } private static void test(){ //递归调用 test(); } } 结果: Except

DoubleC的博客 6148

JAVA:常见内存溢出处理的技术指南

本文探讨了Java开发中常见的内存问题及解决方案。主要分析了内存泄漏、内存溢出、频繁垃圾回收、过度使用Finalizer和内存碎片化五大问题。针对内存泄漏,建议使用VisualVM等工具检测对象引用关系;对于内存溢出,可通过调整JVM参数或优化代码解决;其他问题则推荐选择合适的垃圾回收策略或使用对象池技术。文章还提供了Tomcat、Linux和Docker环境下内存配置的具体方法,并强调合理使用监控工具对提高应用性能的重要性。

木头 968

axis2 java客户端内存溢出怎么办_java中三种常见内存溢出错误的处理方法

更多 10相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区 域:Permanent Generation space(永久保存区...

weixin_36347133的博客 632

Java中的JVM崩溃日志解析 - 处理堆栈内存溢出错误

JVM崩溃通常会生成一个崩溃日志(crash log),其中包含了有关崩溃原因和堆栈内存溢出错误的相关信息。本文将详细解析JVM崩溃日志的含义,并提供相应的源代码来说明堆栈内存溢出错误。通过分析崩溃日志,我们可以了解到堆栈内存溢出错误的原因,并根据所提供的信息进行故障排除和修复。重要的是要注意并修复代码中可能导致堆栈溢出的问题,以确保程序的稳稳定性和可靠性。当我们递归调用方法或者方法调用层级过深时,堆栈内存可能会超出其容量限制,导致堆栈内存溢出错误。方法会无限递归调用自身,导致堆栈内存溢出。

. 849

解决Java内存溢出问题的有效方法

Java堆内存是JVM中最大的一块内存区域,它存储了几乎所有的对象实例及数组数据。从内存分配的角度来看,堆是垃圾收集器管理的主要区域。堆内存被划分为新生代(Young Generation)和老年代(Old Generation)两部分,新生代又进一步细分为Eden区和两个Survivor区。理解堆内存的结构对于解决内存溢出问题至关重要。

weixin_30661119的博客 960

java内存溢出的常见情况与处理方式

内存溢出 1.java堆溢出:java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制 清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。java堆内存的溢出异常是实际应用中常见的内存溢出情况。当出现java对内存溢出时,异常堆栈心信息"java.lang.OutOfMemoryError"会跟着进一步提示"java...

哎哟喂BYY的博客 1055

<Verilog实现除法器> Verilog实现牛顿-拉夫逊(Newton-Raphson)除法器

阿斯顿阿斯顿啊啊是打发士大夫

IC跳跳鱼的博客 3583

java工程积累——如何处理Tomcat内存溢出

在项目的部署中,我们常常遇到一个bug,就是内存溢出

ESOO 2464

博途S7-1200与昆仑通态MCGS纯仿真联调实战指南

本文详细介绍了博途S7-1200与昆仑通态MCGS纯仿真联调的实战指南,包括环境搭建、配置步骤、通信桥接及故障排除。通过TIA Portal和MCGS Pro搭建的仿真环境,可实现80%以上的基础功能验证,适用于工业自动化学习和开发,大幅降低硬件投入成本。

weixin_26834815的博客 436

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

的全称是Permanent Generation space,是指内存的永久保存区域PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

日常工作记录,解决实际问题,不成体系。 1448

3D打印机新手必看:VSCode+PlatformIO搭建Marlin固件编译环境(附常见错误解决)

本文为3D打印机新手详细介绍了如何使用Visual Studio Code和PlatformIO搭建Marlin固件编译环境。内容涵盖从软件安装、源码配置到编译实战的全流程,并重点解析了依赖冲突、内存不足等高频错误的解决方案,帮助用户快速上手并成功编译自定义固件。

j2k3l4的博客 703

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结(oom)

Java程序的每个线程中都有一个独立的堆栈。默认的Java虚拟机最大内存仅为64兆,这在开发调试过程中可能没有问题,但在实际的应用环境中是远远不能满足需要的,除非你的应用非常小,也没什么访问量。清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。

weixin_42164754的博客 5678

OpenAI Codex 桌面端国内使用全坑解決指南(2026 Windows 实测)

本地文件报错:SQLite 初始化失败、启动闪退、卡加载页 → 本地缓存/数据库损坏,和网络无关网络地区报错→ 网络IP/地区被拦截,和本地软件文件无关Codex 桌面端的大部分报错,都不是软件故障,而是海外软件适配国内网络、国内模型协议不兼容导致的适配问题。不用盲目重装、换网络、改系统设置,只要区分「本地文件问题」和「网络地区问题」,搭配国内大模型 API 替代方案,就能完美解决所有痛点。(注:部分内容可能由 AI 生成)

ups_hxc的博客 1048

ACM论文LaTeX模板解析(三)| 文章顶部信息(Top matter))Part 1

文章顶部信息(Top matter))Part 1,文章类型、作者信息等

FreshManInC的博客 4852

Java内存溢出

<br />内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,一般现象是操作一般时间后系统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规律,查看日志或查看数据库也不能定位出问题的代码。<br />更严重的是内存溢出与数据库锁表在系统开发和单元测试阶段并不容易被发现,当系统正式上线一般时间后,操作的并发量上来了,数据也积累了一些,系统就

MRmaomaochong的专栏 1万+

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1671

php 死循环 内存溢出,Fatal Error: Out of memory php内存溢出处理三种方法

有时候我们在运行php程序的时候会发现 Fatal Error: Out of memory 这样的提示,这有可能是程序中用到了大量了变量和对象,导致分配的内存不够用。修改php.ini文件里的memory_limit参数方法一:修改php.ini文件里的memory_limit默认参数128M,修改为256M或者更大memory_limit = 256M;方法二:如果是虚拟主机,我们可以在程序需...

weixin_33046983的博客 2139

bash: huggingface-cli: command not found... 解决方案

本文主要介绍了bash: huggingface-cli: command not found… 解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何处理jvm内存溢出

1       前言相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永...

xxxx3的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

错误处理方法 java_JAVA常见错误处理方法 和 JVM内存结构

OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏;二是调整JVM启动参数增大内存。OutOfMemoryError有好几种情况,每次遇到这个错误时,观察OutOfMemoryError后面的提示信息,就可以发现不同之处,如:java.lang.OutOfMemoryError: Java heap s...

weixin_33722375的博客 110

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: java ismatch_java中正则表达式的运用及示例
下一篇: java内存模型年轻_java内存模型 年轻代/年老代 持久区
王雪皎
博客等级 码龄8年 28粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值