然后程序就会对客户端的请求处理缓慢(虚拟内存没了,换页也会很慢).
直到没办法再请求内存机器崩溃(服务器进程被操作系统杀死).
平台环境windows2000server,开发工具vc6
是因为频繁的new和delete的原因吗?(为什么?)
还是其它的原因?
说明此程序没有内存泄露(程序正常结束的时候编译器没有报).
18 个解决方案
#1
是因为频繁的new和delete的原因吗?
--不一定。也许有别的操作占用空间。比如句柄等
--不一定。也许有别的操作占用空间。比如句柄等
#2
是因为频繁的new和delete的原因吗?
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存
#3
也未必就内存,但肯定是某种资源没有得到正确释放
#4
编译器会报memory leak吗?
SOCKET,HANDLE????这些有leak吗?
SOCKET,HANDLE????这些有leak吗?
#5
程序没报内存泄露,不等于就真的没有内存泄露,例如gdi的一些资源没有释放等等。
#6
碰到过这个情况不知根你一样不就是程序一直在桌面运行的时候,占有A的内存,最小化,再最大化发现占有的就少了。
#7
把代码帖出来看看!
#8
很繁忙的话,比如频繁的NEW DELETE等操作,
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
A:使用MFC里的CSTRING,因为是按128字节增长,所以碎片问题相对较轻,
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
C:增加服务器物理内存,减少线程的默认开启饯,从1M减少到256KB在试
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
A:使用MFC里的CSTRING,因为是按128字节增长,所以碎片问题相对较轻,
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
C:增加服务器物理内存,减少线程的默认开启饯,从1M减少到256KB在试
#9
帮你顶
#10
用bound checker查查吧
我现在也做了一个服务器,很担心出现同样的问题
我现在也做了一个服务器,很担心出现同样的问题
#11
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
================
很多例子都是这样的,这样就害惨了很多人。
应该程序启动的时候,实例化一个对象,这个对象类是自己开发的也可以。
这个对象预先申请5000个节点(比如10字节的100个,100字节的100个,500字节的100个....),并组成链表,当需要内存的时候,就按照大小去*队列中索取,使用完毕之后,再归还给*队列。
当5000个同时用完,再给*队列申请指定个数。
这样不仅不会浪费内存,还会节省内存。因为你的程序可以365天占用的内存都是10M或者30M或者100M。
另外,这种方式管理自己的资源,也可以很快定位到资源浪费的地方,如果你现在没有数据请求,*队列中却少了200个节点,那这2个节点你永远也招不回来了。
这就是你程序的错误所在。你找不到你丢了的东西了。
================
很多例子都是这样的,这样就害惨了很多人。
应该程序启动的时候,实例化一个对象,这个对象类是自己开发的也可以。
这个对象预先申请5000个节点(比如10字节的100个,100字节的100个,500字节的100个....),并组成链表,当需要内存的时候,就按照大小去*队列中索取,使用完毕之后,再归还给*队列。
当5000个同时用完,再给*队列申请指定个数。
这样不仅不会浪费内存,还会节省内存。因为你的程序可以365天占用的内存都是10M或者30M或者100M。
另外,这种方式管理自己的资源,也可以很快定位到资源浪费的地方,如果你现在没有数据请求,*队列中却少了200个节点,那这2个节点你永远也招不回来了。
这就是你程序的错误所在。你找不到你丢了的东西了。
#12
我觉得是你程序问题。
#13
内存泄露
#14
你程序问题
#15
使用内存池,这样就可以大大降低new和delete,不怎样会造成内存碎片.
#16
明显内存泄漏。
#17
八成是内存泄漏
#18
用内存池管理内存
#1
是因为频繁的new和delete的原因吗?
--不一定。也许有别的操作占用空间。比如句柄等
--不一定。也许有别的操作占用空间。比如句柄等
#2
是因为频繁的new和delete的原因吗?
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存
#3
也未必就内存,但肯定是某种资源没有得到正确释放
#4
编译器会报memory leak吗?
SOCKET,HANDLE????这些有leak吗?
SOCKET,HANDLE????这些有leak吗?
#5
程序没报内存泄露,不等于就真的没有内存泄露,例如gdi的一些资源没有释放等等。
#6
碰到过这个情况不知根你一样不就是程序一直在桌面运行的时候,占有A的内存,最小化,再最大化发现占有的就少了。
#7
把代码帖出来看看!
#8
很繁忙的话,比如频繁的NEW DELETE等操作,
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
A:使用MFC里的CSTRING,因为是按128字节增长,所以碎片问题相对较轻,
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
C:增加服务器物理内存,减少线程的默认开启饯,从1M减少到256KB在试
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
A:使用MFC里的CSTRING,因为是按128字节增长,所以碎片问题相对较轻,
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
C:增加服务器物理内存,减少线程的默认开启饯,从1M减少到256KB在试
#9
帮你顶
#10
用bound checker查查吧
我现在也做了一个服务器,很担心出现同样的问题
我现在也做了一个服务器,很担心出现同样的问题
#11
B:在使用NEW的使用应该统一采用32字节的倍数,建议采用一次分配,多次使用,不要开个连接就NEW一个,那就完蛋了
================
很多例子都是这样的,这样就害惨了很多人。
应该程序启动的时候,实例化一个对象,这个对象类是自己开发的也可以。
这个对象预先申请5000个节点(比如10字节的100个,100字节的100个,500字节的100个....),并组成链表,当需要内存的时候,就按照大小去*队列中索取,使用完毕之后,再归还给*队列。
当5000个同时用完,再给*队列申请指定个数。
这样不仅不会浪费内存,还会节省内存。因为你的程序可以365天占用的内存都是10M或者30M或者100M。
另外,这种方式管理自己的资源,也可以很快定位到资源浪费的地方,如果你现在没有数据请求,*队列中却少了200个节点,那这2个节点你永远也招不回来了。
这就是你程序的错误所在。你找不到你丢了的东西了。
================
很多例子都是这样的,这样就害惨了很多人。
应该程序启动的时候,实例化一个对象,这个对象类是自己开发的也可以。
这个对象预先申请5000个节点(比如10字节的100个,100字节的100个,500字节的100个....),并组成链表,当需要内存的时候,就按照大小去*队列中索取,使用完毕之后,再归还给*队列。
当5000个同时用完,再给*队列申请指定个数。
这样不仅不会浪费内存,还会节省内存。因为你的程序可以365天占用的内存都是10M或者30M或者100M。
另外,这种方式管理自己的资源,也可以很快定位到资源浪费的地方,如果你现在没有数据请求,*队列中却少了200个节点,那这2个节点你永远也招不回来了。
这就是你程序的错误所在。你找不到你丢了的东西了。
#12
我觉得是你程序问题。
#13
内存泄露
#14
你程序问题
#15
使用内存池,这样就可以大大降低new和delete,不怎样会造成内存碎片.
#16
明显内存泄漏。
#17
八成是内存泄漏
#18
用内存池管理内存