C#垃圾回收与多线程
MinSi 2013-12-22 03:08:28 问题是这样的,我用C#开发了一套服务器,其中使用了多线程.
本期望能够利用多线程把服务器的所有CPU都利用起来,但经过压力测试后发现,在百人级别时,8核心 CPU占用量可以达到50%左右.
当人数达到1000甚至2000的时候 服务器开始巨卡,查看CPU占用量只有12%-16%(仅一个核心的占用量)
经过无数测试发现,代码中存在new对象操作后,多个线程的确无法完全发挥效率,通过C++代码测试也是如此,
所以我觉得可能new里面操作的是同一个堆,可能有锁. 通过C++实现了线程之间堆的独立,CPU果然占用满了.
但C#却没找到实现类此功能的方法.
还有一个就是GC的垃圾回收,明文写着会挂起所有的线程. 回收完毕再继续.
服务器代码中每tick大概有几百个临时对象的new 当人数上去这些new的量会非常之大,我在手动调用GC垃圾回收的时候做了一个时间统计,最慢的一次居然达到了20秒.
实在解决不了这个问题,来此求助,希望大神能重视能帮忙出主意解决一下!
非常感谢~~~~