对于长期运行的服务器虚拟内存会不断地增长是什么原因?

时间:2020-12-06 18:04:34
运行几天就会虚拟内存就会耗完
  然后程序就会对客户端的请求处理缓慢(虚拟内存没了,换页也会很慢).
  直到没办法再请求内存机器崩溃(服务器进程被操作系统杀死).

  平台环境windows2000server,开发工具vc6

  是因为频繁的new和delete的原因吗?(为什么?)
  还是其它的原因?

  说明此程序没有内存泄露(程序正常结束的时候编译器没有报).


18 个解决方案

#1


是因为频繁的new和delete的原因吗?
--不一定。也许有别的操作占用空间。比如句柄等

#2


是因为频繁的new和delete的原因吗?
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存

#3


也未必就内存,但肯定是某种资源没有得到正确释放

#4


编译器会报memory leak吗?

SOCKET,HANDLE????这些有leak吗?

#5


程序没报内存泄露,不等于就真的没有内存泄露,例如gdi的一些资源没有释放等等。

#6


碰到过这个情况不知根你一样不就是程序一直在桌面运行的时候,占有A的内存,最小化,再最大化发现占有的就少了。

#7


把代码帖出来看看!

#8


很繁忙的话,比如频繁的NEW DELETE等操作,
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
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个节点你永远也招不回来了。

这就是你程序的错误所在。你找不到你丢了的东西了。

#12


我觉得是你程序问题。

#13


内存泄露

#14


你程序问题

#15


使用内存池,这样就可以大大降低new和delete,不怎样会造成内存碎片.

#16


明显内存泄漏。

#17


八成是内存泄漏

#18


用内存池管理内存

#1


是因为频繁的new和delete的原因吗?
--不一定。也许有别的操作占用空间。比如句柄等

#2


是因为频繁的new和delete的原因吗?
不会的,可能是内存泄漏造成的,服务器运行的时候你定时记录一下服务器的占用内存

#3


也未必就内存,但肯定是某种资源没有得到正确释放

#4


编译器会报memory leak吗?

SOCKET,HANDLE????这些有leak吗?

#5


程序没报内存泄露,不等于就真的没有内存泄露,例如gdi的一些资源没有释放等等。

#6


碰到过这个情况不知根你一样不就是程序一直在桌面运行的时候,占有A的内存,最小化,再最大化发现占有的就少了。

#7


把代码帖出来看看!

#8


很繁忙的话,比如频繁的NEW DELETE等操作,
会导致内存碎片,系统来不及整理优化,
所以只好调用虚拟内存,
解决办法:
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个节点你永远也招不回来了。

这就是你程序的错误所在。你找不到你丢了的东西了。

#12


我觉得是你程序问题。

#13


内存泄露

#14


你程序问题

#15


使用内存池,这样就可以大大降低new和delete,不怎样会造成内存碎片.

#16


明显内存泄漏。

#17


八成是内存泄漏

#18


用内存池管理内存