程序开发中防止-OutOfMemory-的方法 (程序开发防止人太多的措施)
防止OutOfMemory失误是在程序开发中十分关键的义务,特意是在处置大规模数据或口头长期间运转的义务时。上方是一些方法,以及关系的源代码示例,来协助你有效地防止OutOfMemory失误。
1.了解内存经常使用状况
在编写程序时,首先要了解你的运行程序的内存需求。经常使用一些工具来监测内存经常使用状况,例如中的MemoryFlPoint,可以协助你在内存无余之前就采取措施。以下是一个示例:
try{using(MemoryFailPointmemFailPoint=newMemoryFailPoint(100)){//口头须要少量内存的操作}}catch(InsufficientMemoryException){//处置内存无余的状况}
2.经常使用内存剖析工具
经常使用内存剖析工具来识别潜在的内存走漏。工具如JetBrainsdotMemory、ANTSMemoryProfiler或VisualStudioDiagnosticTools可以协助你找到内存走漏并优化内存经常使用。
3.监禁资源
确保在不再须要时监禁对象和资源。经常使用Dispose方法或using块来监禁资源,尤其是在处置文件、数据库衔接、网络衔接等方面。以下是一个示例:
using(varstream=newFileStream("data.txt",FileMode.Open)){//经常使用文件流}
4.经常使用内存缓存
在某些状况下,经常使用内存缓存可以协助缩小对反双数据的读取和减轻数据库或磁盘的累赘。经常使用MemoryCache或其余缓存库来存储和检索数据。
usingSystem.Runtime.Caching;varcache=MemoryCache.Default;var>5.优化数据结构选用适当的数据结构来存储数据,以缩小内存占用。例如,经常使用List<T>时,思考能否可以经常使用Array来替代。防止经常使用过多的嵌套汇合,由于它们或者会占用少量内存。
6.内存调配池
经常使用内存调配池来缩小渣滓回收的频率。在高性能运行程序中,可以经常使用对象池来重复经常使用对象,而不是频繁地调配和监禁内存。以下是一个示例:
//创立对象池varobjectPool=newObjectPool<MyObject>(()=>newMyObject(),100);//失掉对象varobj=objectPool.Get();//经常使用对象//将对象放回池中objectPool.Return(obj);
7.逐渐处置大数据集
假设须要处置大规模数据集,可以思考分批次处置数据,而不是一次性性加载整个数据集到内存中。这可以经过迭代器(yield)来成功。
publicIEnumerable<T>ProcessLargeData(IEnumerable<T>>8.异步编程在处置大规模数据或耗时操作时,经常使用异步编程模型可以缩小内存占用。经常使用async/await来防止阻塞线程,从而缩小内存消耗。
9.监控内存
经常使用性能监控工具来监督内存经常使用状况。在消费环境中,可以经常使用运行性能治理工具来实时监控内存经常使用,以及活期剖析内存存储和回收状况。
在实践运行中,理论须要联合上述方法,依据运行程序的需求和特点来选用适当的战略。防止OutOfMemory失误是一个综合性的义务,须要不时优化和监控。
代码内存溢出怎么解决
问题一:内存溢出的解决方法内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。 第一步,就是修改JVM启动参数,直接增加内存。 这一点看上去似乎很简单,但很容易被忽略。 JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128MB,对于稍复杂一点的系统就会不够用。 在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。 因此,-Xms,-Xmx参数一定不要忘记加。 第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。 在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用DBCP连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现“OutOfMemory”错误。 经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得DBCP报“OutOfMemory”错误。 经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。 查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。 第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。 重点排查以下几点:? 检查代码中是否有死循环或递归调用。 ? 检查是否有大循环重复产生新对象实体。 ? 检查对数据库查询中,是否有一次获得全部数据的查询。 一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。 这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。 因此对于数据库查询尽量采用分页的方式查询。 ? 检查List、MAP等 *** 对象是否有使用完后,未清除的问题。 List、MAP等 *** 对象会始终存有对对象的引用,使得这些对象不能被GC回收。 第四步,使用内存查看工具动态查看内存使用情况。 某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。 这种情况一般是代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。 内存查看工具有许多,比较有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。 它们的基本工作原理大同小异,都是监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。 开发人员可以根据这些信息判断程序是否有内存泄漏问题。 一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。 持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。 通过间隔一段时间取一次内存快照,然后对内存快照中对象的使用与引用等信息进行比对与分析,可以找出是哪个类的对象在泄漏。 通过以上四个步骤的分析与处理,基本能处理内存溢出的问题。 当然,在这些过程中也需要相当的经验与敏感度,需要在实际的开发与调试过程中不断积累。 问题二:为什么点开查看代码就弹出内存溢出请优化代码,找出内存溢出的原因。 代码正常的话,一般计算机的内存都是够用的。 正常的工作表 里面没有VBA代码的话 扩展名为XLSX 如果有 通常为XLS 也或许是你添加了控件之类的 才会出现 隐私警告 此工作簿包含AC.....什么控件和宏 不能通过什么检查 也或许是不小心触动了 工作表的什么事件 没有关系的 解决方法 1 另存 保存的时候选择否 另存为启用宏的 2 如果你不另存的话 点击右键 进入VBE界面 看到小菜单 有你各表名称的里面 只要看到有能删除的文字都删除 问题三:内存溢出错误怎么解决你好,内存溢出可能是病毒作怪,也有可能是程序错误. 内存溢出是指系统内存全部被占用,没有可用内存分配给新启动的任务的情况,通常不会导致系统崩溃。 可以扩展一条内存,或者增大虚拟内存的大小 下面以在Windows XP下转移虚拟内存所在盘符为例介绍虚拟内存的设置方法: 一、手动设置虚拟内存 在默认状态下,是让系统管理虚拟内存的,但是系统默认设置的管理方式通常比较保守,在自动调节时会造成页面文件不连续,而降低读写效率,工作效率就显得不高,于是经常会出现“内存不足”这样的提示,下面就让我们自已动手来设置它吧。 ①用右键点击桌面上的“我的电脑”图标,在出现的右键菜单中选择“属性”选项打开“系统属性”窗口。 在窗口中点击“高级”选项卡,出现高级设置的对话框. ②点击“性能”区域的“设置”按钮,在出现的“性能选项”窗口中选择“高级”选项卡,打开其对话框。 ③在该对话框中可看到关于虚拟内存的区域,点击“更改”按钮进入“虚拟内存”的设置窗口。 选择一个有较大空闲容量的分区,勾选“自定义大小”前的复选框,将具体数值填入“初始大 二、量身定制虚似内存 1.普通设置法 根据一般的设置方法,虚拟内存交换文件最小值、最大值同时都可设为内存容量的1.5倍,但如果内存本身容量比较大,比如内存是512MB,那么它占用的空间也是很可观的。 所以我们可以这样设定虚拟内存的基本数值:内存容量在256MB以下,就设置为1.5倍;在512MB以上,设置为内存容量的一半;介于256MB与512MB之间的设为与内存容量相同值。 2.精准设置法 由于每个人实际操作的应用程序不可能一样,比如有些人要运行3DMAX、Photoshop等这样的大型程序,而有些人可能只是打打字、玩些小游戏,所以对虚拟内存的要求并不相同,于是我们就要因地制宜地精确设置虚拟内存空间的数值。 ①先将虚拟内存自定义的“初始大小”、“最大值”设为两个相同的数值,比如500MB; ②然后依次打开“控制面板→管理工具→性能”,在出现的“性能”对话框中,展开左侧栏目中的“性能日志和警报”,选中其下的“计数器日志”,在右侧栏目中空白处点击右键,选择右键菜单中的“新建日志设置”选项; ③在弹出的对话框“名称”一栏中填入任意名称,比如“虚拟内存测试”。 在出现窗口中点击“添加计数器”按钮进入下一个窗口; ④在该窗口中打开“性能对象”的下拉列表,选择其中的“Paging File”,勾选“从列表中选择计数器”,并在下方的栏目中选择“%Usage Peak”;勾选“从列表中选择范例”,在下方的栏目中选择“_Total”,再依次点击“添加→关闭”结束 ⑥在右侧栏目中可以发现多了一个“虚拟内存测试”项目,如果该项目为红色则说明还没有启动,点击该项,选择右键菜单中的“启动”选项即可 接下来运行自己常用的一些应用程序,运行一段时间后,进入日志文件所在的系统分区下默认目录“PerfLogs”,找到“虚拟内存测试_”并用记事本程序打开它,在该内容中,我们查看每一栏中倒数第二项数值,这个数值是虚拟内存的使用比率,找到这项数值的最大值,比如图中的“46”,用46%乘以500MB(前面所设定的虚拟内存数值),得出数值为230MB。 用该数值可以将初始大小设为230MB,而最大值可以根据磁盘空间大小自由设定,一般建议将它设置为最小值的2到3倍。 这样我们就可以将虚拟内存打造得更精准,使自己的爱机运行得更加流畅、更具效率......>> 问题四:内存不足、内存溢出的原因和解决方法?引起内存不足、内存溢出的 原因 有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2. *** 类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小; 内存溢出的解决方案 : 第一步 ,修改JVM启动参数,直接增加内存。 (-Xms,-Xmx参数一定不要忘记加。 ) 第二步 ,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。 第三步 ,对代码进行走查和分析,找出可能发生内存溢出的位置。 重点排查以下几点: 1.检查对数据库查询中,是否有一次获得全部数据的查询。 一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。 这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。 因此对于数据库查询尽量采用分页的方式查询。 2.检查代码中是否有死循环或递归调用。 3.检查是否有大循环重复产生新对象实体。 4.检查对数据库查询中,是否有一次获得全部数据的查询。 一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。 这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。 因此对于数据库查询尽量采用分页的方式查询。 5.检查List、MAP等 *** 对象是否有使用完后,未清除的问题。 List、MAP等 *** 对象会始终存有对对象的引用,使得这些对象不能被GC回收。 第四步 ,使用内存查看工具动态查看内存使用情况。 问题五:内存溢出是什么意思?如何解决?内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。 如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。 据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。 程序做的不好,用完内存不知道把内存释放给其他的程序或者系统实用,一段时间后由于此程序占用大量的内存而使得其他程序或者系统没有足够的内存使用而出现速度狂慢哗硬盘灯狂闪的现象,这就是内存益处.解决的方法就是重起电脑.可能是你安装的某个程序,比如说什么小游戏造成的. 问题六:java内存溢出怎么解决第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查, 1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被废品器回收。 2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类, 算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。 中的内存溢出大都是因为栈中的变量太多了。 其实内存有的是。 建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。 1),变量所包含的对象体积较大,占用内存较多。 2),变量所包含的对象生命周期较长。 3),变量所包含的对象数据稳定。 4),该类的对象实例有对该变量所包含的对象的共享需求。 4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。 所以也不容忽视。 第二还有就是String类相关的东西: 1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。 差别很大。 而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。 2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。 (包括vector的size方法)。 特别是循环次数多的时候,尽量把length放到循环外面。 int size = (); for (int i = 2; i问题七:为什么excel不能运行代码,显示内存溢出有很多种原因,首先应检查的是你的变量范围... 再者检查引用数组的时候是否索引出现负数等 最好把代码贴出来 问题八:EXCEL查看代码是显示“内存溢出”请优化代码,找出内存溢出的原因。 代码正常的话,一般计算机的内存都是够用的。 正常的工作表 里面没有VBA代码的话 扩展名为XLSX 如果有 通常为XLS 也或许是你添加了控件之类的 才会出现 隐私警告 此工作簿包含AC.....什么控件和宏 不能通过什么检查 也或许是不小心触动了 工作表的什么事件 没有关系的 解决方法 1 另存 保存的时候选择否 另存为启用宏的 2 如果你不另存的话 点击右键 进入VBE界面 看到小菜单 有你各表名称的里面 只要看到有能删除的文字都删除 问题九:java代码修改,使其占有更少的内存空间,解决内存溢出问题参加下面的代码,核心思想是分段进行处理 yuncode/code/c_a11b54 问题十:java中举个内存溢出的例子,以及如何解决这个问题的 有实例代码就最好啦List list = new ArrayList(); while(1==1) { (xxxxxxxxxxxxxxx); }
怎么在eclipse中设置java heap size,防止OutOfMemoryError
用eclipse 开发,在用ant编译我的web工程时,碰到: Java heap space异常。 解决办法->preferences->java->installed jres->edit jre把default vm arguments 的参数设为-Xms64m -Xmx512方法2。 在window的环境变量中添加JAVA_OPTS=-Xms64m -Xmx512m
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。