1.怀疑在程序中应用的CACHE,
2.CACHE中有大量的数据
3.频繁刷新CACHE
4.没有设计好CACHE的方式
你的问题我以前也遇见过,我以前是用的Session,后我全部改成cook之后就好多了,应该是你的Session或是你的CACHE有问题(CACHE不太懂,但多多少应该是有的)
跟踪下SQL的调用记录,在每次往CACHE或SESSION写入大量数据时记录一下时间,看是否太过频繁
1.在win2003里asp.net的进程就是w3wp.exe
3.优化asp.net程序,就向楼上的说的那样,少用或不用session cache application之类的东西,再有就是是不是有翻页的地方,翻页处理不好也是会占很多内存的。
4.限制sql的内存。企业管理器——SQL的属性(一般是local)——“内存”标签
在这里看内存的设置,把最大值改成100M吧。
第四条是最快的方法,可以试一试。
我的一个自开发OA系统也存在这样的问题。
总结上面,大概原因是因为 session 和 cache 的不合理使用造成的。
我的应用程序中,确实用了很多的Session 和 Cache,
在 MSDN 中找到 了 “动态内存分配”这一篇,今天就试看矗?欠裼行А?br />希望有经验的朋友多给些信息,大家也好总结下出现类似错误的原因,谢谢!!
不知道你是什么网站。按理说是不会占用这么大的。如上你用了cache存放了超额的内容。当然。象session这种是不太可能占用这么大的了,或用了application 类似的一些有超长时间或永久保持性的对象来保存大量数据。如利用单例保存数据这些都有可能造成使用大量的内存。
建义2003系统安装至少1G内存。
w3wp.exe是2003下的一个iis进程,至于楼主说的sql占用内存,那有可能是因为你的sql没有设置占用内存上限
在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。
解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。
根据w3wp取得是那个一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。
优化内存,提高内存的使用效率,尽可能地提高运行速度,是我们所关心的问题。下面介绍在Windows操作系统中,提高内存的使用效率和优化内存管理的几种方法。1、改变页面文件的位置
其目的主要是为了保持虚拟内存的连续性。因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率。而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上。改变页面文件位置的方法是:用鼠标右键点击“我的电脑”,选择“属性→高级→性能设置→高级→更改虚拟内存”,在驱动器栏里选择想要改变到的位置即可。值得注意的是,当移动好页面文件后,要将原来的文件删除(系统不会自动删除)。
2、改变页面文件的大小
改变了页面文件的位置后,我们还可以对它的大小进行一些调整。调整时我们需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正“塞满”,它会在内存储量到达一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就低,执行的速度也就越慢。最大页面文件是极限值,有时打开很多程序,内存和最小页面文件都已“塞满”,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,以免出现“满员”的情况。
3、禁用页面文件
当拥有了512MB以上的内存时,页面文件的作用将不再明显,因此我们可以将其禁用。方法是:依次进入注册表编辑器“HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession Ma-nagerMemoryManagement”下,在“DisablePa-ging Executive”(禁用页面文件)选项中将其值设为“1”即可
4、清空页面文件
在同一位置上有一个“ClearPageFileAtShutdown(关机时清除页面文件)”,将该值设为“1”。这里所说的“清除”页面文件并非是指从硬盘上完全删除pagefile.sys文件,而是对其进行“清洗”和整理,从而为下次启动Windows XP时更好地利用虚拟内存做好准备。
点评:本文较详细地讲解了虚拟内存的概念及优化方法。使我们了解了它在内存与硬盘之间的工作关系,同时认识到了虚拟内存并非越大越好,而应该根据计算机的具体配置进行合理的调整。相信大家在真正的了解并掌握了虚拟内存的作用与优化方法后,一定会使爱机在性能上有所提升。
5、调整高速缓存区域的大小
可以在“计算机的主要用途”选项卡中设置系统利用高速缓存的比例(针对Windows 98)。如果系统的内存较多,可选择“网络服务器”,这样系统将用较多的内存作为高速缓存。在CD-ROM标签中,可以直接调节系统用多少内存作为CD-ROM光盘读写的高速缓存。
6、监视内存
系统的内存不管有多大,总是会用完的。虽然有虚拟内存,但由于硬盘的读写速度无法与内存的速度相比,所以在使用内存时,就要时刻监视内存的使用情况。Windows操作系统中提供了一个系统监视器,可以监视内存的使用情况。一般如果只有60%的内存资源可用,这时你就要注意调整内存了,不然就会严重影响电脑的运行速度和系统性能。
7、及时释放内存空间
如果你发现系统的内存不多了,就要注意释放内存。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。释放内存最简单有效的方法,就是重新启动计算机。另外,就是关闭暂时不用的程序。还有要注意剪贴板中如果存储了图像资料,是要占用大量内存空间的。这时只要剪贴几个字,就可以把内存中剪贴板上原有的图片冲掉,从而将它所占用的大量的内存释放出来。
8、优化内存中的数据
在Windows中,驻留内存中的数据越多,就越要占用内存资源。所以,桌面上和任务栏中的快捷图标不要设置得太多。如果内存资源较为紧张,可以考虑尽量少用各种后台驻留的程序。平时在操作电脑时,不要打开太多的文件或窗口。长时间地使用计算机后,如果没有重新启动计算机,内存中的数据排列就有可能因为比较混乱,从而导致系统性能的下降。这时你就要考虑重新启动计算机。
9、提高系统其他部件的性能
计算机其他部件的性能对内存的使用也有较大的影响,如总线类型、CPU、硬盘和显存等。如果显存太小,而显示的数据量很大,再多的内存也是不可能提高其运行速度和系统效率的。如果硬盘的速度太慢,则会严重影响整个系统的工作。
本文主要内容
本文主要从概念上介绍内存回收及垃圾收集器相关内容,不涉及具体性能调优。
内存回收是程序员永恒的主题,虽然Java虚拟机自动回收内存,但仍存在内存漏泄的可能,需要理解内存回收机制,有助于程序员规避、排查内存泄漏问题。
GC机制,最重要的是三个问题:
对象已死
对象是否已经死亡,可被回收,经常能听到下面这种说法:
引用计数法 :给对象中添加一个引用计数器,每当有一个地方引用时,计数器就加1,当引用失效时,计数器值就减1,任何时候计数器为0的对象就是不可能再被使用的
不过,它存在一个致命缺陷,很难解决循环引用问题,比如对象AB,A引用B,B也引用A,但它们再没有被其它人所引用,AB理应是被回收对象,但它们的引用计数器仍然不为0,导致无法回收。
Java虚拟机不使用此算法来判定对象是否死亡,不过它依然有很多优点,简单。Android 中的智能指针即是使用这种方法,不过添加了智能指针强弱引用来解决循环引用问题
可达性分析算法 ,这个算法的基本思路就是通过一系列的名为“GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到“GC Roots"没有任何引用链相连,则此对象不可用,将被回收
在Java中,可作为“GC Roots"的对象包括以下几种:
引用
在JDK1.2以前,引用的概念为:
JDK1.2之后,引用概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种,四种引用强度依次减弱。
垃圾收集算法
本章将介绍三种垃圾收集算法。
标记清除算法 ,算法分成“标记”和“清除”两个阶段,首先标记出需要回收的对象,在标记完成后统一回收掉所有被标记的对象
它主要有两个问题,一是效率不高,标记和清除过程的效率都不高,另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多,当程序在运行中需要分配较大对象,因为碎片过多,可能无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作
复制算法 ,为了解决效率问题,一种称为复制的收集算法出现了。它将内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。每次都是只对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是代价高昂,将内存缩小为原来的一半。
现在的商业虚拟机都采用这种算法来回收新生代,新生代中的对象98%是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间,当回收时,将Eden和Survivor看还存活的对象一次性拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。
虚拟机默认Eden和Survivor的大小比例是8比1,所以只有10%的空间会被浪费。
如果存活的对象较多而Survivor空间不够用时,需要依赖其它内存(老年代)进行分配担保,如果另外一块Survivor空间没有足够的空间来存放上一次新生代的存活对象,这些对象将直接通过分配担保机制进入老年代
标记整理算法 ,复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变得更低,更关键的是,如果不想浪费一半的空间,就需要额外的空间进行分配担保,以应对所有对象百分百存活的极端情况。所以老年代一般不直接使用这种算法
根据老年代的特点,提出了“标记整理算法”,过程依然和“标记清除算法”一致,但后续步骤不是直接对可回收对象进行清除,而是让所有存活对象都向一端移动,然后直接清理掉边界以外的内存。
分代收集算法
当前商业虚拟机的垃圾收集都采用分代收集算法。它根据对象存活周期的不同将内存划分为几块。
一般是把Java堆分成新生代和老年代,新生代又分成一块较大的Eden和两块Survivor。根据各个年代的特点采用最适当的收集算法。
在新生代中,每次垃圾回收时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率罗高,没有额外空间对它进行分配担保,就必须使用标记清理或者标记整理算法。
垃圾收集器
Serial收集器
Serial收集器是最基本、历史最悠久的收集器。顾名思义,这个收集器是一个单线程收集器。单线程的意义并不仅仅说明它只会使用一个CPU或者一条线程去完成垃圾收集工作,更重要的是它在垃圾收集时,必须暂停其他所有的工作线程(Sun将这件事情称之为“Stop the world”),直到它结束
“Stop the world”,非常影响用户体验,虚拟机在后台自动发起和完成的,在用户不可见的情况下把用户的正常工作的线程全部停掉。
虽然Serial收集器出现时间较长,但它依然是Client模式下的默认新生代收集器
ParNew收集器
ParNew收集器其实就是Serial收集器的多线程控制版本,除了使用多条线程进行垃圾收集之外,其它和Serial收集器完全一样。
ParNew收集器是Server模式下虚拟机中的首选的新生代收集器。而且在单CPU环境下,ParNew绝对不会比Serial更高效,甚至由于存在线程交互的开销,在两个CPU的环境中都不一定比Serial更好
Parallel Scavenge收集器
Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法,又是并行的多线程收集器,看上去和ParNew一样,但它非常的有特点。
Parallel Scavenge收集器关注点即是吞吐量,CMS等收集器的关注点是尽量缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge的目的则是达到一个可控制的吞吐量。
Parallel Scavenge提供两个参数用于精准控制吞吐量
Serial old收集器
Serial old收集器是Serial收集器的老年代版本,同样是一个单线程收集器,使用标记整理算法,它的主要意义也是被Client模式下的虚拟机使用
Parallel old收集器
Parallel old是Parallel Scavenge收集器的老年代版本,使用多线程和标记整理算法。
CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它很适合互联网站或者B/S系统的服务端上。
从Mark Sweep名字可知,CMS用的是标记清除算法,它的动作过程较之前的复杂一些,整个过程分为4个步骤:
其中初始标记、重新标记这两个步骤仍然需要 “Stop the world”。初始标记只是标记一下GC Roots能直接关联到的对象,速度很快,并发阶段就是进行GC Root Tracing的过程,而重新标记则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,重新标记时间略比初始标记长,但远比并发标记时间短。
整个过程最耗时的是并发标记和并发清除,但用户线程和收集器线程一起工作,所以总体上说,CMS收集器的内存回收过程是与用户线程一起并发地执行。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)