在循环里面New 很多次的话,会不会有内存问题?

时间:2022-09-11 13:15:20

for(int i=0;i<=100000;i++)
{
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}

比如这样?

27 个解决方案

#1


和new是否多没有关系。
只要这个对象没有被任何引用变量引用,就会被回收。

#2


不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。

#3



EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;

这样呢?

#4


运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降

#5


楼主你的头像可否换下

#6


引用 3 楼 canl464970302 的回复:
C# code


EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;


这样呢?

只是说这么做有没有必要。

#7


必然比不new费内存 。

但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。

#8


引用 5 楼 aspwebchh 的回复:
楼主你的头像可否换下

- -!

#9


引用 7 楼 accomp 的回复:
必然比不new费内存 。

但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。

呃...我要是循环几万,几百万次呢?

#10


啊,程序报了内存不足的问题!但是该释放的我都释放了,实在找不到哪还有内存的问题!
头疼!

#11


几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。
但具体清理时机不清楚,

内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。

#12


若new出的对象都在使用,那可能使内存不足

#13



System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);

找到了我把try catch 去掉以后 报的内存错误是在这地方
但是这个对象我用完以后就释放掉了啊?
这是怎么回事

#14


运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
整体代码是什么?

#15


你写一个静态类,专处理EXIFMetaData类里的
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题

#16




 public Metadata GetEXIFMetaData(string PhotoName)
    {
        
        // 创建一个图片的实例
        
        System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
        // 创建一个整型数组来存储图像中属性数组的ID
        int[] MyPropertyIdList = MyImage.PropertyIdList;
        //创建一个封闭图像属性数组的实例
        PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
        //创建一个图像EXIT信息的实例结构对象,并且赋初值

        #region 创建一个图像EXIT信息的实例结构对象,并且赋初值
        Metadata MyMetadata = new Metadata();
        MyMetadata.DatePictureTaken.Hex = "9003";
       // MyMetadata.Ver.Hex = "9000"; // 
        MyMetadata.MakeSoftware.Hex = "131";

        #endregion

        // ASCII编码
        System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding();

        int index = 0;
        int MyPropertyIdListCount = MyPropertyIdList.Length;
        if (MyPropertyIdListCount != 0)
        {
            foreach (int MyPropertyId in MyPropertyIdList)
            {
                MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId);

                #region 初始化各属性值
                string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x");
               switch (myPropertyIdString)
                {
                    //case "9000":
                    //    {
                    //        MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                    //        MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                    //        break;
                    //    }
                    case "9003":
                        {
                            MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                            MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                            break;
                        }
                    case "131":
                        {
                            if (MyImage.GetPropertyItem(MyPropertyId).Value != null)
                            {
                                MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                                MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                                break;
                            }
                            else
                            {
                                break;
                            }
                        }
                    //省略N行相似代码
                }
                #endregion

                index++;
            }
            MyImage.Dispose();

        }
        
        return MyMetadata;
    }


整个方法

#17


有木有人。

#18



EXIFMetaData em = null;
for(int i=0;i<=100000;i++)
{
em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}

#19


学习下

#20


用完了,调用释放即可。

#21


lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。

#22


工具解决方法  -->  公布解决方法

#23


1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。

2、建议LZ换个头像,真的让人作呕。

#24


引用 21 楼 sp1234 的回复:
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try..……


学习了,问题找到了
坑爹的高清图片!他妈的那张图片居然21兆 - -!所以生成图片对象就内存不足了!

#25


引用 23 楼 submain 的回复:
1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。

2、建议LZ换个头像,真的让人作呕。


那个试过 没用。不过还是谢谢大家啦!哈哈。

#26


引用 21 楼 sp1234 的回复:
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try..……

呃,你从哪儿看出来我滥用 try...catch咧?
我上面的代码都没用这个

#27


引用 5 楼 aspwebchh 的回复:
楼主你的头像可否换下

顶,倒胃口啊

#1


和new是否多没有关系。
只要这个对象没有被任何引用变量引用,就会被回收。

#2


不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。

#3



EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;

这样呢?

#4


运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降

#5


楼主你的头像可否换下

#6


引用 3 楼 canl464970302 的回复:
C# code


EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;


这样呢?

只是说这么做有没有必要。

#7


必然比不new费内存 。

但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。

#8


引用 5 楼 aspwebchh 的回复:
楼主你的头像可否换下

- -!

#9


引用 7 楼 accomp 的回复:
必然比不new费内存 。

但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。

呃...我要是循环几万,几百万次呢?

#10


啊,程序报了内存不足的问题!但是该释放的我都释放了,实在找不到哪还有内存的问题!
头疼!

#11


几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。
但具体清理时机不清楚,

内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。

#12


若new出的对象都在使用,那可能使内存不足

#13



System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);

找到了我把try catch 去掉以后 报的内存错误是在这地方
但是这个对象我用完以后就释放掉了啊?
这是怎么回事

#14


运行效率会下降,毕竟垃圾回收器是不定期回收,性能下降
整体代码是什么?

#15


你写一个静态类,专处理EXIFMetaData类里的
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题

#16




 public Metadata GetEXIFMetaData(string PhotoName)
    {
        
        // 创建一个图片的实例
        
        System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
        // 创建一个整型数组来存储图像中属性数组的ID
        int[] MyPropertyIdList = MyImage.PropertyIdList;
        //创建一个封闭图像属性数组的实例
        PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
        //创建一个图像EXIT信息的实例结构对象,并且赋初值

        #region 创建一个图像EXIT信息的实例结构对象,并且赋初值
        Metadata MyMetadata = new Metadata();
        MyMetadata.DatePictureTaken.Hex = "9003";
       // MyMetadata.Ver.Hex = "9000"; // 
        MyMetadata.MakeSoftware.Hex = "131";

        #endregion

        // ASCII编码
        System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding();

        int index = 0;
        int MyPropertyIdListCount = MyPropertyIdList.Length;
        if (MyPropertyIdListCount != 0)
        {
            foreach (int MyPropertyId in MyPropertyIdList)
            {
                MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId);

                #region 初始化各属性值
                string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x");
               switch (myPropertyIdString)
                {
                    //case "9000":
                    //    {
                    //        MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                    //        MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                    //        break;
                    //    }
                    case "9003":
                        {
                            MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                            MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                            break;
                        }
                    case "131":
                        {
                            if (MyImage.GetPropertyItem(MyPropertyId).Value != null)
                            {
                                MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
                                MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
                                break;
                            }
                            else
                            {
                                break;
                            }
                        }
                    //省略N行相似代码
                }
                #endregion

                index++;
            }
            MyImage.Dispose();

        }
        
        return MyMetadata;
    }


整个方法

#17


有木有人。

#18



EXIFMetaData em = null;
for(int i=0;i<=100000;i++)
{
em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}

#19


学习下

#20


用完了,调用释放即可。

#21


lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。

#22


工具解决方法  -->  公布解决方法

#23


1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。

2、建议LZ换个头像,真的让人作呕。

#24


引用 21 楼 sp1234 的回复:
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try..……


学习了,问题找到了
坑爹的高清图片!他妈的那张图片居然21兆 - -!所以生成图片对象就内存不足了!

#25


引用 23 楼 submain 的回复:
1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
LZ试试GC.Collect();可以吧,释放后进行强制回收。

2、建议LZ换个头像,真的让人作呕。


那个试过 没用。不过还是谢谢大家啦!哈哈。

#26


引用 21 楼 sp1234 的回复:
lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。

我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try..……

呃,你从哪儿看出来我滥用 try...catch咧?
我上面的代码都没用这个

#27


引用 5 楼 aspwebchh 的回复:
楼主你的头像可否换下

顶,倒胃口啊