130万数据,报内存溢出怎么解决,怎么优化

MyEclipse总是报内存溢出的问题,一直在building workspace ,优化Myeclipse ,配置也改了,还是不行_百度知道
MyEclipse总是报内存溢出的问题,一直在building workspace ,优化Myeclipse ,配置也改了,还是不行
提问者采纳
内存换个新的
过一个小时左右在开机
难道是内存条出问题了?
你用橡皮擦下
提问者评价
其他类似问题
为您推荐:
内存溢出的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用写优化DSO来处理数据覆盖的问题!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&作者:JSC_DGD
有些标准的数据源,如果我们直接在上面做标准的DSO的话,会出现数据覆盖的问题,比如:生产的(2lis_04_p_comp),预算的(0PU_IS_PS_2)等。本来按照标准的模型搭建,这两个数据源是直接把数上到cube的,但是有的时候我们要把数做一些处理的时候,直接上到cube的话,有点麻烦。我们之前采用关键值累计的方式来上数,但是带来的问题就是,每次上数必须把PSA的数分时间段full上载,然后这个又带一个问题出来了,反冲的数没法上处理。用处理链一路删数倒是可以做,但是始终都是不安全的。后来我们采用用写优化DSO来解决这个问题。我们在做写优化DSO设置的时候,他会自动生成3个关键值,每条数都会有一个数据编号,这样就解决了数据覆盖的问题。不过,写优化DSO也有缺陷,他是不需要激活数据的,也就是说不会生成SID,这样也就没法直接在写优化DSO上直接出报表了!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。pheongap项目:
主要的问题:
heap过大,内存低性能差的机子上引起奔溃,直接退出
关于web app的优化,不仅仅只是js方面,包括HTML布局嵌套,CSS的属性使用,数据的读取,还有浏览器的重排与回流之类的这里就不讨论了,
本章涉及的是脚本代码引发的性能问题,更进一步说就是闭包带来的内存泄露
关于性能:
首先我不得不承认一个事实,移动端的性能跟PC端,那完全不是一回事
比如用innerHTML绘制大段的HTML结构,之后同步获取生成HTML中的ID节点,结果不存在
这种问题在单页面模拟多页面,动态创建DOM的时候,尤为明显
var element
= $('&div id = "aaron"&...填充大量结构...&/div&');
$(root).html(element)
$('#aaron')
这个是很简单的一段代码,按照常规的认识,JS主线程与GUI的渲染线程是互斥的,所以在执行JS的时候,GUI应该就是挂起的, 同理执行GUI的时候亦然, 因为JS可以动态操作节点,所以如果我们在GUI绘制的时候做操作明显就会打乱了,所以互斥的解释也合理
但是实际上这样并不能直接获取到$('#aaron'),PC上基本不会出现,常规的办法都是加setTimeout
实际上由于setTimeout的机制,所以也是不准确的,当然我已经有一个比较完美的方式解决
关于JavaScript内存管理:
JavaScript会给开发者一个错觉:可以不用考虑内存管理
现代浏览器已经够聪明了,从2012年起,所有现代浏览器都使用了标记-清除垃圾回收算法。所有对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进,并没有改进标记-清除算法本身和它对&对象是否不再需要&的简化定义。
所以引用计数收集与循环引用之类的都不再是问题了,过去导致内存泄漏的许多经典模式在现代浏览器中以不再导致泄漏内存。
但是,如今有一种不同的趋势影响着内存泄漏。许多人正设计用于在没有硬页面刷新的单页中运行的 Web 应用程序。在那样的单页中,从应用程序的一个状态到另一个状态时,很容易保留不再需要或不相关的内存。
典型的就是: 单页面模拟多页面的行为
简单的内存管理测试
&button id="start_button"&Start&/button&
&button id="destroy_button"&Destroy&/button&
脚本代码:
var Leaker = function() {
this.name = 'aaron'
$("#start_button").click(function(){
leak = new Leaker();
$("#destroy_button").click(function(){
leak = null;
点击Start& 产生一个对象leak = new Leaker();
点击Destroy 销毁这个对象 观察下内存中变化(工具后面会提到)
点击Start ,产生一个对象
点击Destroy,对象销毁
那么这个图很形象的说明了,#Delata释放了一个实例,就是内存被回收了
如果不做任何处理,那么这个对象leak始终最存在整个生命周期内(全局上下文的情况)
如果leak = null,内存确实是由浏览器GC 自动给回收了
闭包引起的内存泄漏:
代码:内部增加了一个定时器,递归调用
var count = 0;
var Leaker = function(){};
Leaker.prototype = {
init:function(){
this._interval = null;
this.start();
start: function(){
var self = this; //递归调用自身
this._interval = setInterval(function(){
self.onInterval();
destroy: function(){
if(this._interval !== null){
clearInterval(this._interval);
onInterval: function(){
console.log("Interval",count);
从样的观察
我在按了销毁,leak = null了
可见代码依然还在走,可见此时内存绝对的溢出了,也就是失控了
但是监视器显示该对象回收了
那么这个问题就很明显了,通过leak = null 销毁的只是引用,内部如果还存在引用的话,这个heap是不会被回收的
此时这个内存我们已经管理不到了,会一直递归下去
要解决只能在销毁的时候先停止定时器了
由此可见,引用不仅仅只是外部的, 内部同样存在这样的问题,当然引用类型的机制本来就是这样的
所以在日常的代码编写方面,JS的坑确实不少,接下来看看我项目中的大坑吧!!!
应用截图:
内存使用检测:
Eclipse不熟悉的路过,我们还是回到前端的角度去处理
具体的使用就不介绍了,大家接着看
抓怕的heap快照,实时反馈的信息
系统的闭包数
加上JQuery
列字段解释:
Constructor -- 构造器
Distance -- 估计是对象到根的引用层级距离
Objects Count -- 给出了当前有多少个该类的对象
Shallow Size -- 对象所占内存(不包含内部引用的其它对象所占的内存)(单位:字节)
Retained Size -- 对象所占总内存(包含内部引用的其它对象所占的内存)(单位:字节)
小伙伴都吓呆了
项目中除去系统与一些插件的,至少有上千个闭包
分析堆快照
Object's retaining tree视图显示出了该对象被哪些对象引用了,以及这个引用的名称
关于XUTUTIL.Event类
XUTUTIL.Event是一个构函数函数,主要就是一个订阅/发布模式
那么这个图我的理解就是通过XUTUTIL构造生成的的对象都应该是放到这个里面,所以
根据分析图显示,这个类有208个对象,被实例了208次,也就是说存在这么多订阅者了
XUTUTIL部分源码(观察者模式)
XUTUTIL.Event//=================自定义事件===================
所有组件的最顶层类
一个抽象基类
为事件机制的管理提供一个公共接口
子类应有一个"events"属性来定义所有的事件。
//==============================================
(function () {
var XUTUTIL = Xut.util,
= Xut.each,
FALSE = false;
XUTUTIL.Observable = function () {
var me = this, e = me.
if (me.listeners) {
me.on(me.listeners);
delete me.
me.events = e || {};
1 数据保护
2 事件冒泡
3 事件挂起
* @type {Object}
XUTUTIL.Observable.prototype = {
* 加入一个事件处理函数
* @param {String}
事件处理函数的名称
* @param {Function} 事件处理函数
* @param {Object}
(可选的) 事件处理函数执行时所在的作用域。处理函数&this&的上下文
eventName 是对象形式,递归分解
保存所有事件对象
addListener:function (eventName, fn, scope, o) {
var me = this,
//分解元素
if (typeof eventName == 'object') {
o = eventN
for (e in o) {
oe = o[e];
if (!me.filterOptRe.test(e)) {
me.addListener(e, oe.fn || oe, oe.scope || o.scope, oe.fn ? oe : o);
eventName = eventName.toLowerCase();
localEvent = me.events[eventName] || TRUE;
//第一次添加,创建Event对象
if (typeof localEvent == 'boolean') {
me.events[eventName] = localEvent = new XUTUTIL.Event(me, eventName);
localEvent.addListener(fn, scope, typeof o == 'object' ? o : {});
&&&&&&&&&&&&&&&&&&&&&&&
如图me.events[eventName]标记,是数组保存了观察对象了
我们在翻一页看看,生成对比快照
点击图中的黑色实心圆圈按钮,即可得到第二个内存快照:
点击图中的&Summary&,可弹出一个列表,选择&Comparison&选项,然后选择对比第一个,结果如下图:
这个视图列出了当前视图与上一个视图的对象差异。
列名字段解释:
# New -- 新建了多少个对象
# Deleted -- 回收了多少个对象
# Delta -- 对象变化值,即新建的对象个数减去回收了的对象个数
ALLOC -- 变化的内存大小(字节)注意Delta字段,尤其是值大于0的对象
很明显翻一页就创建大量的观察对象
*注:因为是单页面应用,动态多页面的翻页算法,比如当前是从第2页到第3页,其实是预先创建第4页面,销毁第1页,保留234页,所以这个+14,不是这样算的
但是第一个很明显的问题就出来,为什么要动态创建这么多的观察对象,找到代码来源
找到问题了
注册了大量的观察者模式
销毁的代码,没有处理注销观察者事件
啪啪啪啪。。。。一阵修改之后
翻页的时候不处理了
在进入页面初始化的时候208变成18个了。。。在看看内存占用。。。45016---3240
PC上的消耗,在移动端就会被放大的,所以不要放过过任何一个可优化的地方
因为这个案例比较明显,还有的问题,要靠自己慢慢去分析引用情况了
那么很明显了:观察者模式引起的内存泄漏
需要观察者模式(Observer)来解藕一些模块,但如果使用不当,也会带来内存泄漏的问题。
排查这类型的内存泄漏问题,主要重点关注被引用的对象类型是闭包(closure)和数组Array的对象。
1.如果能避免观察模式的使用,就尽量避免,
2.避免不了一定要记得清理
总结出以下几种常见的情况:
1.闭包上下文绑定后没有释放;
2.观察者模式在添加通知后,没有及时清理掉;
3.定时器的处理函数没有及时释放,没有调用clearInterval方法;
4.视图层有些控件重复添加,没有移除。
大型应用,优化是任重道远的,本文只是希望起到一个抛砖引玉的作用。。。。。。。。。。。。。。
各位道友,你们怎么看?如果觉得有收获就点击一下 推荐哇~~~~~
声明:本文为原创文章,如需转载,请注明来源并保留原文链接,谢谢!
阅读(...) 评论()java程序性能优化之找出内存溢出元凶_Java123社区微信号:java123msg |||[][]当前位置: &
& java程序性能优化之找出内存溢出元凶我曾经在刚入行的时候做过一个小的swing程序,用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java我曾经在刚入行的时候做过一个小的程序,用到了 SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutOfMemoryError异常,就是java的内存溢出。当时也上网查了不少资料,试过一些办法,代码也稍微做了些优化,但是有一个问题我始终是找不到解决的方案 - 不知为什么子窗体关闭后java的垃圾回收机制无法回收其资源,因为这个程序可能要经常开关一些子窗体,那么这些子窗体关闭后无法释放资源就造成了程序OutOfMemoryError的潜在的隐患!&最近无意间在网上看到了一个监控java程序内存使用的工具 - JProbe,马上回想起那个未解决的难题,于是我就下载了JProbe8.0.0希望从分析内存入手找到我要的答案。软件下载安装后,在安装目录里详尽的用户指南(懂点软件和英语的人很快就能上手),主要是两个步骤:&1.用JProbe Config工具根据提示生成或者程序的控制脚本(一个.jpl文件和一个.bat文件),在命令行里进入.bat文件所在的目录,然后执行该批处理让要监控的java程序跑起来&2.运行JProbe Console工具,点击&Attach to Session...&按钮,弹出java程序的内存实时监控图表&Runtime Summary&,我们主要是看&Data&卡片里的内容(注意:第一次使用该软件可能会遇到一些小问题:比如发布为jar包的程序如果运行时会去读配置文件,从控制脚本启动的话,可能会发生配置文件找不到的异常,解决办法是:不要打jar包,直接就用文件夹发布;还有可能因为一些杀毒软件的网络防火墙导致JProbe无法连接到控制脚本的session,造成监控图表打不开,解决办法是:取消防火墙对于JProbe访问网络的限制)&实时监控图表&Runtime Summary&如下图所示:&可以设置要监视的包或者类,然后点击&Refresh Runtime Data&按钮刷新这些对象占用内存的情况,当你觉得某个类比较可疑的话,你可以在不断的使用程序的过程中监视它的生命周期,看看它是否像预期的那样在结束了生命周期后占用的内存就被释放。众所周知:java的内存回收是自动进行的,无需程序员干预,我们称其为垃圾回收,这个垃圾回收可能是不定期的,就是当程序占用内存资源比较少的情况下可能jvm的垃圾回收频率就比较低;反之,java程序消耗内存资源比较多的情况下,垃圾回收的频率和力度就比较高,这种垃圾回收的不确定性很可能会影响我们的判断,但我们可以点击JProbe监控界面右上方的&Request a Garbage Collection&(像一个垃圾桶的图标)按钮来向jvm发出垃圾回收的请求,等几秒后再去点击&Refresh Runtime Data&,这个时候如果那个预期应该已经销毁的对象的类名还是没有从监控界面下方的class列中消失或者其对象数量没有减少的话(请多试几次,中间可以夹杂些其他增加程序内存使用的操作以确保jvm确实执行了垃圾回收),那恭喜你!90%的可能性你已经找到了程序的某个缺陷&这个查找元凶的过程可能是相当耗时的,是对程序员的耐心的挑战。我熬了一下午一晚上,功夫不负有心人,基本上把我那个小程序的所有内存溢出的漏洞都找到并补上了。事实告诉我之前那个子窗体关闭后资源无法释放的根本原因是:子窗体虽然调用了dispose()方法,但是子窗体对象的引用一直都在:或者是被静态HashMap引用、或者是它的内部子线程类没有释放、或者是它的某个事件监听类没有释放(借用JProbe的火眼金睛一检验,发现问题真是一大堆啊!),so.我们要彻底释放某个对象占用资源的关键在于找到并释放所有对它的引用!&下面是我解决具体问题的一些经验:&程序中造成内存溢出可能性最大的是HashMap,Hashtable等等集合类,尤其是静态的,更是要慎之又慎!!!它们引用的对象可能你感觉已经销毁了,其实很可能你忘记remove键值,而如果这些集合对象还是静态的挂在其他类里面,那么这个引用可能一直都在,借用JProbe测试一下,结果往往出人意料,解决办法:彻底删除键,remove、clear,如果允许最好把集合对象设为null&对于不再使用的线程对象,如果要彻底杀了它,很多书上都推荐用join方法,我之前也是这样做的,但后来借助JProbe工具我吃惊的发现这样做很可能要杀的线程仍旧好好的活在你日益增大的内存里,很可能调用了线程的sleep方法后用join方法就会有点问题,解决办法:在join方法前再加一句执行interrupt方法,不过这个时候可能会有新的问题:执行interrupt方法后你的线程类会抛InterruptedException,上有政策下有对策,加一个开关变量做判断就能完美解决,可参考下面的代码:&共3页顶一下(0)0%踩一下(0)0%------分隔线------上一篇: 下一篇: 栏目列表推荐内容Java中的反射机制 ------- android培训、java培训、期待与您交流!...
游戏快正式上线了,今天发现一个bug,让人哭笑不得。数据计算...
日常敲代码时候肯定免不了要遇到转换json数据的时候,记录一下...
晚上在eclipse上安装了m2eclipse插件,然后使用maven创建了一个小项...
最近在写往公司产品里添加Tomcat适配器,以支持Tomcat。有一些功...
今天接触了Servlet,Servlet 是一个 Java程序,是在服务器上运行以...}

我要回帖

更多关于 tomcat内存溢出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信