Hashtable ht = new Hashtable();
int i = 0;
string Err = "";
try
{
while(i < 10000000) //这里的值可以更大,目的是导致内存溢出。
{
i++;
ht.Add(Guid.NewGuid().ToString(), "TEST");//向哈希表里添加一个元素。
}
}
catch(Exception ex)
{
Err = ex.ToString();
}以上哈希表会产生内存溢出
但是捕获不到错误
请高手帮忙!
谢谢!!!

解决方案 »

  1.   

    我也遇到过同样的问题,而且当这个hashtable越来越大的时候
    机子就越来越慢最后我放弃这个方法了
      

  2.   

    不知道微软如何解决?
    JAVA好像用Hashmap替换了Hashtable
    估计原因也是因为这个
    在JAVA里Hashtable一样会出现这个内存溢出
      

  3.   

    遗憾,不要就是了,你也可以自己实现一个Hashtable.
      

  4.   

    怎么自己实现一个Hashtable
      

  5.   

    如果都是字符串的话,用NameValueCollection---------------------
    四十年来家国,三千里地山河,凤阁龙楼连霄汉,玉树琼枝作烟箩。几曾识干戈? 
      

  6.   

    所有无限制的使用内存都会内存溢出,如果出现这种情况,那只能说明
    1 程序设计,编写的有问题,为什么会使用那么大的内存。即使使用这么大的内存,能不能把不用的数据放到缓存中,非要在内存中放着,如果可以就不要简单的使用hashtable。
    2 如果出现这种情况,我想唯一能作的就是升级硬件,但这是不明智的,关键还是在1上找办法。
      

  7.   

    applelppa(人生若只如初见) :我试了
    不行一样是内存溢出
    而且程序还是无法捕捉到错误
      

  8.   

    回复人: Richardhu(学无止境) ( ) 信誉:100  2005-06-06 14:37:00  得分: 0  
     
     
       所有无限制的使用内存都会内存溢出,如果出现这种情况,那只能说明
    1 程序设计,编写的有问题,为什么会使用那么大的内存。即使使用这么大的内存,能不能把不用的数据放到缓存中,非要在内存中放着,如果可以就不要简单的使用hashtable。
    2 如果出现这种情况,我想唯一能作的就是升级硬件,但这是不明智的,关键还是在1上找办法。
      
     
    -----------------------------------------------
     弱弱的一问
    怎么把数据放到缓存去
      

  9.   

    存放到缓存中,首先这个对象的类可以序列化。
    ------------------------------------
    令一个类可序列化的最简单的方式是按如下所示使用 Serializable 属性标记它。[Serializable]
    public class MyObject {
      public int n1 = 0;
      public int n2 = 0;
      public String str = null;
    }
    以下代码示例说明该类的实例是如何被序列化到一个文件中的。MyObject obj = new MyObject();
    obj.n1 = 1;
    obj.n2 = 24;
    obj.str = "Some String";
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, obj);
    stream.Close();
    --》摘自MSDNms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconbasicserialization.htm你也可以反序列化,从文件读到对象的值.
    object obj = formatter.Deserialize(stream);如果对文件有要求,你可以使用独立存储区概念来实现,System.IO.IsolatedStorage,请参考MSDN:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingisolatedstorage.htm还有就是Hashtable 是继承了ISerializable,所以可以序列化,和反序列化的,这样你就可以把内存不需要的数据存放到缓存中,释放内存,来为其它程序提供内存空间。
      

  10.   

    Richardhu(学无止境) :我的这个程序
    主要目的是要解决重复IP过滤的问题
    每秒钟将发生至少80次的请求
    我是利用哈希表过滤重复IP
    由于是动态的
    所以要使用内存
    而且数据量非常大
    我没有找到可以代替的方式另外不要建议我使用数据库来过滤
    肯定当机
    我已经试验过了请给个建议
      

  11.   

    int i = 0;
    改为 long i = 0;
      

  12.   

    内存溢出一般不是程序的错,而是操作系统的错,所以程序不能捕捉,
    试一下:
    每一个IP地址都可以转化为唯一的一个int32类型的整数,共4G个,
    开一个4g/32=128M的int数组(共4g bit=512m byte),数组里每一个int的每一位表示一个ip是否存在,一个int可以表示32个ip是否存在,
    比较时先把ip转化成int32格式,然后可以使用二分法查找,查到后判断该位置的数值,如果为1则存在,为0则不存在,
    数组需要开512m的虚拟内存空间,因为是稳定的,不需要动态增长,win程序的虚拟内存控件为4g,我想不会有问题的。不过为了速度,最好把内存加大一点。
      

  13.   

    比较时先把ip转化成int32格式,然后可以使用二分法查找,查到后判断该位置的数值,如果为1则存在,为0则不存在,
    更正:
    转换为uint32格式, 不需要二分法查询,设 ip = n; 数组 int[] ipflags = new int[128m]
    index = ip / 32;
    subindex = ip % index
    int flag = int[index];
    bool exists = flag & 2^flag
      

  14.   

    非得一张表搞那么大干什么。
    你可以分个hashtable来处理。
    比如说。以字母开头,每个字母一个表。