关于JAVA中内存溢出的解决办法

ImageIO.read导致内存溢出问题 【代码】ImageIO.read导致内存溢出问题。 阅读详情

关于JAVA中内存溢出的解决办法

J2ee应用系统是运行在J2EE应用服务器上的,而j2ee应用服务器又是运行在JVM上的,

生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用。要优化系统,则需要对JVM参数进行合理的设置,所以我们需要了解究竟在什么地方进行设置、有哪些参数以及各参数的意义分别是什么,并且我们还得了解JVM的内存管理机制究竟是个什么玩意儿?其实我们在网上搜索引擎上,一搜就有可以获取到一大把相关信息,关键是我们如何深入的理解它们。那么下面我们就简单的介绍一下究竟什么是JVM的内存管理机制吧~!  

 

JVM的早期版本并没有进行分区管理;这样的后果是JVM进行垃圾回收时,不得不扫描JVM所管理的整片内存,所以搜集垃圾是很耗费资源的事情,也是早起JAVA程序的性能低下的主要原因。随着JVM的发展,JVM引进了分区管理的机制。

 

JVM所管理的所有内存资源分为2个大的部分。永久存储区(Permanent Space) 和堆空间(The Heap Space)。其中对空间又分为新生区()和养老区,新生区又分为伊甸园,幸存者0区、幸存1区。如下图:

 

关于个分区的用途,大家可以参考其他相关文档。本教程所要处理的问题是如何解决内存溢出的问题。接下来以tomcat服务器为例:

我们首先得找到内存管理所要设置的参数在哪个文件:<CATALINA_HOME>/bin/catalina.bat。

需要添加一行代码:

JAVA_OPTS="-Xms512m-Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=256m"

下面分别对各参数进行介绍和解释:

JVM 相关参数:

参数名参数说明

-server 启用能够执行优化的编译器, 显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。生产环境的服务器强烈推荐设置此参数。

-Xss 单个线程堆栈大小值;JDK5.0 以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-XX:+UseParNewGC 可用来设置年轻代为并发收集【多CPU】,如果你的服务器有多个CPU,你可以开启此参数;开启此参数,多个CPU 可并发进行垃圾回收,可提高垃圾回收的速度。此参数和+UseParallelGC,-XX:ParallelGCThreads搭配使用。

+UseParallelGC 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。可提高系统的吞吐量。

-XX:ParallelGCThreads 年轻代并行垃圾收集的前提下(对并发也有效果)的线程数,增加并行度,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。永久存储区相关参数:参数名参数说明

-Xnoclassgc 每次永久存储区满了后一般GC 算法在做扩展分配内存前都会触发一次FULL GC,除非设置了-Xnoclassgc.

-XX:PermSize 应用服务器启动时,永久存储区的初始内存大

-XX:MaxPermSize 应用运行中,永久存储区的极限值。为了不消耗扩大JVM 永久存储区分配的开销,将此参数和-XX:PermSize这个两个值设为相等。堆空间相关参数参数名参数说明

-Xms 启动应用时,JVM 堆空间的初始大小值。

-Xmx 应用运行中,JVM 堆空间的极限值。为了不消耗扩大JVM 堆控件分配的开销,将此参数和-Xms 这个两个值设为相等,考虑到需要开线程,讲此值设置为总内存的80%.

-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。

上面所列的JVM 参数关系到系统的性能,而其中-XX:PermSize,

-XX:MaxPermSize,-Xms,-Xmx 和-Xmn 这5 个参数更是直接关系到系统的性能,系统是否会出现内存溢出。

-XX:PermSize 和-XX:MaxPermSize 分别设置应用服务器启动时,永久存储区的初始大小和极限大小;在生成环境中强烈推荐将这个两个值设置为相同的值,以避免分配永久存储区的开销,具体的值可取系统“疲劳测试”获取到的永久存储区的极限值;如果不进行设置-XX:MaxPermSize 默认值为64M,一般来说系统的类定义文件大小都会超过这个默认值。

-Xms 和-Xmx 分别是服务器启动时,堆空间的初始大小和极限值。-Xms的默认值是物理内存的1/64 但小于1G,-Xmx 的默认值是物理内存的1/4 但小于1G.在生产环境中这些默认值是肯定不能满足我们的需要的。也就是你的服务器有8g 的内存,不对JVM 参数进行设置优化,应用服务器启动时还是按默认值来分配和约束JVM 对内存资源的使用,不会充分的利用所有的内存资源。

 

 

 

结论:“永久存储区溢出(java.lang.OutOfMemoryError:Java Permanent Space)”乃是永久存储区设置太小,不能满足系统需要的大小,此时只需要调整-XX:PermSize 和-XX:MaxPermSize 这两个参数即可。“JVM 堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”错误是JVM 堆空间不足,此时只需要调整-Xms 和-Xmx 这两个参数即可。

 

 

 

到此我们知道了,当系统出现内存溢出时,是哪些参数设置不合理需要调整。但我们怎么知道服务器启动时,到底JVM 内存相关参数的值是多少呢?

这个问题其实Sun公司早已经意料到了,所以给我们开发了内存使用监控工具jvmstat.

大家可以到ORACLE官网进行下载。用它可以很方便的看到我们的服务器内存使用情况。

将下载的jvmstat包解压到如“C:\ProgramFiles\Java\jvmstat”(这是我本地java路径,大家可以根据自己所安装的java环境的路径进行解压)。启动完之后我们就可以使用visualgc命令了,cmd进入命令符窗口,输入tasklist(windows下查看进程任务PID)查找到你要检测进程PID.然后直接输入visuglgc PID 就会弹出三个可见视图。

如下图:

 

 

 

 

 

 

参考资料《浅谈SUNJVM 内存管理与应用服务器的优化之SUNJVM 内存管理》JasonS.H.Chen

参考资料《浅谈SUNJVM 内存管理与应用服务器的优化之服务器内存分配与优化》JasonS.H.Chen

从零到一:uniPush2.0全链路集成与多厂商通道配置实战 本文提供了uniPush2.0从零开始的全链路集成与多厂商通道配置实战指南。详细讲解了DCloud平台配置、uniCloud云函数开发、客户端CID获取与消息监听,并重点攻克了华为、小米、OPPO、vivo等主流厂商推送通道的配置难点与避坑技巧,帮助UniApp开发者实现“一次集成,全端覆盖”的高效消息推送方案。 阅读详情

相关推荐

Java内存溢出的原因和解决办法

Java内存溢出问题可能由对象引用未被释放、内存泄漏、过大的对象或数据集合以及递归调用导致的栈溢出等原因引起。为了解决这些问题,我们应该确保及时释放对象引用、正确管理资源、使用高效的数据结构和算法以及设计合理的终止条件。这些措施将有助于减少内存消耗并避免Java程序的内存溢出问题的发生。然而,由于不正确的内存使用和管理,Java程序可能会遇到内存溢出的问题。本文将介绍Java内存溢出的几种常见原因,并提供相应的解决办法解决办法:确保递归方法有合理的终止条件,并考虑使用迭代替代递归,以避免栈溢出

TechWhiz的博客 359

完美解决java读取大文件内存溢出的问题

下面小编就为大家带来一篇完美解决java读取大文件内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

DeerFlow 系列教程 第十一篇 | Sandbox 沙箱与 Memory 记忆——安全执行与持久认知

用户请求│▼Lead Agent├── 系统提示词组装│ ├── <memory> 段 ← Memory 系统注入用户记忆│ ├── <skill_system> 段│ └── <subagent_system> 段│├── 工具调用│ ├── read_file ├── Sandbox 系统提供隔离执行│ ├── write_file├── 路径虚拟化 + 安全验证│└── 对话结束│▼│├── 过滤消息(去除工具调用中间步骤)├── 检测纠正/强化信号。

weixin_43674738的博客 142

上传图片重新调整大小导致内存溢出oom

imageio.read 内存溢出

ray的博客 2640

javax.imageio.ImageIO.read(file) 内存溢出

近期使用ImageIO对象生成图片的缩略图功能,无论图片大小,总是会报出以下异常信息: Caused by: java.lang.OutOfMemoryError: Java heap space         at java.awt.image.DataBufferByte.(Unknown Source)         at java.awt.image.ComponentSampl

cnyanzi_1989的专栏 1万+

常见的内存泄漏及检测方法

iOS内存泄漏的常见情况 1、声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC的delegate为self(也就是父VC),这样的结果就是子VC也间接持有了父VC,造成循环引用,在Pop子VC的时候不会调用delloc。一个例子: 一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UI

onebutterfly 1544

Java内存溢出问题解决办法

Java内存溢出是常见问题,现介绍内存溢出问题的几种解决办法,不仅适用于TongWeb,也适用所有的Java程序。问题具体原因就不再解释了,对于初学者先知道大概解决办法就行了。本文只是举例常见解决办法,实际使用中JDK版本可能稍有差异,本文无法覆盖所有的JDK版本。此类问题还是需要使用者了解JVM内存机制,请参看JDK文档。 以下介绍的这些JVM参数老版本TongWeb是加在startserver启动脚本中,新版本TongWeb是加在bin/external.vmoptions文件中,本......

web的博客 6850

Java中OutOfMemoryError(内存溢出)的原理及解决办法

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

weixin_41545601的博客 2040

Java内存溢出场景及解决办法

Java内存溢出通常发生在以下几种情况:堆内存溢出、栈内存溢出、方法区内存溢出以及直接内存溢出。每种溢出情况都有其特定的原因和解决方案。内存溢出Java应用开发中常见的问题,但通过合理的代码优化内存管理以及JVM参数调整,我们可以有效地避免和解决这类问题。在开发过程中,我们应该时刻关注应用的内存使用情况,及时发现并解决潜在的内存溢出问题,确保应用的稳定性和性能。

勤劳的小琪 1387

JAVA内存溢出(OutOfMemoryError)的解决办法

关于JAVA内存溢出解决办法 J2ee应用系统是运行在J2EE应用服务器上的,而j2ee应用服务器又是运行在JVM上的, 生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用。要优化系统,则需要对JVM参数进行合理的设置,所以我们需要了解究竟在什么地方进行设置、有哪些参数以及各参数的意义分别是什么,并且我们还得了解JVM内存管理机制究竟是个什么玩意儿?其实我们在网上搜

CTO成长之路——Rosanu 1448

Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

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

石懒猪很懒的博客 220

六种java内存溢出解决办法

Java常见的几种内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError:Javaheapspace:这种是java内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环; 如果是java内存不够的话,可以通过调整JVM下面的配置来解决: -Xms3062m -Xmx3062m 【情况二】 java.lang.OutOfMemoryError...

m0_38087224的博客 4937

(转)关于JAVA内存溢出解决办法

关于JAVA内存溢出解决办法   原文地址:http://blog.csdn.net/czp0608/article/details/7352024 分类: 技术文摘 2012-03-14 10:53 8189人阅读 评论(0) 收藏 举报 javajvm应用服务器服务器存储优化 关于JAVA内存溢出解决办法 J2ee应用系统是运行在J2EE应用服务器上...

mlxia的专栏 237

java memory 溢出_Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

架构优化文章集合​在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:PermanentGeneration space(永久保存区域)、Heap space(堆区域)、JavaStacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGens...

weixin_35025136的博客 431

Java内存溢出场景 解决办法

Java内存溢出即程序在申请内存时,没有足够的空间供其使用,出现out of memory。常见于四种情况:栈溢出(StackOverflowError)、堆溢出(OutOfMemoryError:java heap space)、永久代溢出(OutOfMemoryError: PermGen space)、OutOfMemoryError:unable to create native...

极客on之路 2004

Java内存溢出解决办法

一、Java内存溢出的原因: (1)内存中加载的数据量过于庞大,,如一次性从数据库中取出过多的数据; (2)集合类中有对对象的引用,使用完之后未清空,使得JVM不能回收; (3)代码中存在死循环或者循环产生过多重复的对象尸体; (4)使用的第三方软件中的Bug; (5)JVM的启动参数设定的过小。二、解决Java内存溢出的方案: 第一步:修改JVM的启动参数,直接增加内存使用-Xms,

hutongling的博客 4110

java内存溢出问题解决办法

Java 内存溢出是常见问题, 现介绍内存溢出问题的几种解决办法, 不仅适用于 TongWeb,也适用所有的 Java 程序。 以下介绍的这些JVM参数都是加在TongWeb的startserver启动脚本中或JVM的启动参数中,本文不再介绍 shell 或批处理文件的写法 1. OutOfMemoryError: PermGen space 异常 这种问题常发生于 Oracle JDK 和

tian_xiao_tiger的博客 1495

java 内存溢出 及时解决办法

java.lang.OutOfMemoryError: Java heap space 解决方法 http://www.blogjava.net/liuwentao253/archive/2008/06/03/205466.html 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 1.可以在windows 更改系统环境变量

来自【熊华明·爷】的专栏 689

2025年电赛E题-简易自行瞄准装置,参赛作品包括软硬件和车身结构(源码+图纸+教程)

2025年电赛E题-简易自行瞄准装置,参赛作品包括软硬件和车身结构(源码+图纸+教程)这是本次作品的整体结构,底盘部分采用立创天猛星(mspm0主控)使用5路灰度传感器来进行巡线,采用CCS编写代码。云台采用立创天空星(STM32F407)控制步进电机云台运用野火RS485进行通信,视觉模块使用庐山派K230进行视觉识别。机械结构采用分离搭建(就是下方的步进电机倒置,轴固定以电机为旋转平台,这样可以集中线束与放置电池),这样的结构不会绕线调节代码更加安全。使用继电器控制激光笔开关。本仓库开源的资料内容包括:主控板的原理图与PCB文件底盘部分的逻辑代码,采用CCS编写使用模块的官方资料1.1 项目文件说明:1.1.1 Hardware主控板的原理图与PCB文件1.1.2 Firmwaremspm0-modules-底盘部分的逻辑代码STM32F4_Code_for_Contest_final-云台部分代码​ Camera Code-视觉代码1.1.3 Docs使用模块的官方资料

上一篇: 小需求,解决方案
下一篇: ireport的使用总结
NickCheng
博客等级 码龄18年 91粉丝 22原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值