此问题网上很多人都遇到过,百度出来的解决方案似乎都不能解决,请高手帮忙。程序代码就一行:System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));
图片大小:3.3MB 尺寸:3648*2736 正常的数码照片
经过测试当回收工作进程的时候,运行正常,当内存到达一定值的时候,问题就出现这个异常了。
在相同环境下,改变图片的尺寸也可以运行,比如用PS缩小到宽为3500px的时候正常,3057px的时候就不正常,且此数值不固定。后来想到一个办法,就是当内存达到800M后自动回收工作进程,运行一天,没有问题,晚上就出现了一个莫名其妙的问题:“字符串转换时间函数Convert.ToDateTime”报错,所有用到的地方都提示“该字符串未被识别为有效的 DateTime”,随后,回收工作进程,一切正常,真郁闷了,也不知道和内存自动回收有没有关系。
运行后出现下面的错误提示:Server Error in '/' Application.
--------------------------------------------------------------------------------Out of memory. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.OutOfMemoryException: Out of memory.
Stack Trace: 
[OutOfMemoryException: Out of memory.]
   System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement) +380120
   System.Drawing.Image.FromFile(String filename) +6
   ASP.up_aspx.Button1_Click(Object sender, EventArgs e) +26
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5102 

解决方案 »

  1.   

    可以一段一段的读
    如果文件没有有效的图像格式,或者如果 GDI+ 不支持文件的像素格式,则此方法将引发 OutOfMemoryException 异常 
     检查datetime数据
      

  2.   

    你这样的话 为什么不把他设为静态的呢,如果你有引用你的对象,垃圾回收就不会运作,而你是web程序,应该使用后就Dispose就可以了
      

  3.   

    图片和日期字符串肯定都没有问题,回收工作进程,就都整常了,也都Dispose了
      

  4.   

    纠正一个错误:比如用PS缩小到宽为3500px的时候正常,3557px的时候就不正常
      

  5.   

    关于时间转换函数,有人说是这个函数的Bug,并给出了下面这个函数,一般很少出现这种情况
    /// <summary>
        /// 得到格式 yyyy-MM-dd HH:mm:ss.fff 日期型, 是否补0、是否有时间、是否有毫秒都行
        /// 支持只要是按照 年 月 日 小时 分钟 秒 毫秒 排列的任何字符串,分隔符可以是 ' ', '-', ':', '.', '/', '\\', ','
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DateTime GetDateTime_Cn(string value)
        {
            string[] valueItem = value.Split(new char[] { ' ', '-', ':', '.', '/', '\\', ',' });
            return new DateTime(Convert.ToInt32(valueItem[0]), Convert.ToInt32(valueItem[1]), Convert.ToInt32(valueItem[2]),
                valueItem.Length > 3 ? Convert.ToInt32(valueItem[3]) : 0,
                valueItem.Length > 4 ? Convert.ToInt32(valueItem[4]) : 0,
                valueItem.Length > 5 ? Convert.ToInt32(valueItem[5]) : 0,
                valueItem.Length > 6 ? Convert.ToInt32(valueItem[6]) : 0);
        }
      

  6.   

    System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));
    ----------------------------------------------------------------------------------
    这行代码是存在内在泄露的问题,特别是如果你的路径不存在这个文件时最明显,之前我也遇到过类似的情况,在这段代码前加一个try就行了!如:
    Try
    {
    System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));}
    Catch
    {
      //不成功
    }
      

  7.   

    像素x位深/8...不一定38M,32位色才有那么大...你图片大小3648*2736,24位色就是28M多,16位色就是19M多...基础知识...你这图片不算太大,但是加载太多就有问题...要及时释放内存,不显示的图片要释放...另外...FromFile方法如果文件没有有效的图像格式或者如果GDI+不支持文件的像素格式,也会引发OutOfMemoryException异常...留意一下是普遍情况还是个别文件有问题...
      

  8.   

    这张图片肯定没有问题的,位深度是24,关于文件处理的相关对象最后也都释放了,我觉得是不是这样的原因呢:.Net 2.0环境对内存管理造成的,因为当回收内存的时候,就一切正常了,当内存到达一个相对峰值时,应用程序对单个对象占用内存的大小就有限制了呢。测试中,这个图片在小一点点就没有问题了。
      

  9.   

    “最后释放”是多久?你的并发量是多少?有没有做缓存?缓存策略是怎样的?做做压力测试...也许只是你的硬件条件不够用了,需要升级或扩充服务器...ps:关于日期处理,你的做法超级不正规...去看看MSDN中DateTime.ParseExact方法和日期时间格式化的部分...
      

  10.   

    像素x位深/8...不一定38M,32位色才有那么大...你图片大小3648*2736,24位色就是28M多,16位色就是19M多...基础知识...你这图片不算太大,但是加载太多就有问题...要及时释放内存,不显示的图片要释放...另外...FromFile方法如果文件没有有效的图像格式或者如果GDI+不支持文件的像素格式,也会引发OutOfMemoryException异常...留意一下是普遍情况还是个别文件有问题...我的就是某些图片就会出现这种问题。请教是什么原因!!