根据string.Intern 可以看看string的内存是否释放
现在的问题就是,我有一个服务在运行,里面有while(true){string html = "";}
我分析内存,内存一直在增加,我希望可以释放掉string 申请的内存,请问如何做好些
环境mono linux(环境可忽略,有方法就可)
现在的问题就是,我有一个服务在运行,里面有while(true){string html = "";}
我分析内存,内存一直在增加,我希望可以释放掉string 申请的内存,请问如何做好些
环境mono linux(环境可忽略,有方法就可)
解决方案 »
- 当WinForm Treeview被编辑时,能否控制那个像Textbox的编辑框?
- 关于gridview不用checkbox选中多行的问题
- long? 这样的定义是什么意思
- udp socket 通讯问题
- winform中tabcontrol 颜色问题, 急!!!
- 高分!高手们进来看一眼,程序中引用了图片,结果出现了很多的怪问题!
- 无法将类型为“System.Data.DataView”的对象强制转换为类型“System.Data.DataTable”
- 对你们来说肯定是一个简单的问题(UDP通信)
- 跪求:多应用集成问题,散尽分求答案
- 如何在web方式下弹出提示框的就象在windows下的MessageBox?
- 哪种报表控件可以实现如此效果?
- CodeSmith 找不到.net Framework Data Provider
GC.Collect();
那什么。内存的增长是我面对的问题,如果gc那么简单实现了,我就不来发帖了
绕过托管堆,自己管理。
希望快速释放内存,用 StringBuilder 比用String 要好
还可以调用 GC.Collect() 通知GC强行释放内存。
[assembly:CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]
while(true){string html = "";......html=null;}
每隔5秒钟再调用一次
GC.Collect();
GC.WaitForPendingFinalizers();可以使程序内存不变动很大
至于马上回收string,目前还没找到解决方法。
相反频繁调用string.Intern检索大量内容不同的字符串,则这些字符串都会被留存在intern pool中,而且到程序结束都不会释放,内存就会一直增加。
http://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.100).aspx
把String提出来再测试
String str;
while(true)
{
str="";
}
内容相同的字符串会占用相同的固定内存地址。只是生成了好多个临时的指向常量字符串的好多html变量而已,而这些变量会自动删除的,在内存使用到一定的时候,GC会自动的释放,观察内存使用情况就可以发现,内存会稳定在一个范围,程序停止后会逐步的减小使用。
因为string是只读性的。
如果你有大量的字符串拼接用StringBuffer,如果用String将会有很多String常量存放于内存中
string html = "";
while(true)
{
html="xxx";
}
这样行不行?只有一个实例,用完就null.
c#不熟悉,如果是c,c++可以这样。
{
String temp = "xxx";
}
byte a = 0;//同一个变量表中,不同作用域的slot会被重用,也就是说temp在一个作用域的第一个slot中,会被byte a覆盖掉
gc();//会造成stop the world
}不知道对于您是否有用???
就可以了啊,这个就不会再内存开辟空间了。
.net里有定义好的空字符串 静态常量 string.Empty
你用这个,无论你怎么循环,也不会浪费内存好吧、。、
你的思路问题,即使没有string.Empty,你也可以自己定义一个空字符串常量嘛
for (int i = 0; i < 1000; i++)
{
sb.Append("ccccccdjsofijsoadfjasjfzjfiasuedjoiff");
}
while (true)
{
string html = sb.ToString();
}
写了如上代码,在windows下,内存没有增长~
下面有两段代码:
public void AAA()
{
while(true)
{
BBB("参数");
}
}
public void BBB()
{
string html ="";
//复杂的处理过程,开辟很多的对象;
}------------------------------------------------------
public void AAA()
{
while(true)
{
string html ="";
//复杂的处理过程,开辟很多的对象;
}
}两个代码 看似一样,但是其实是有区别的!
两个代码都是死循环,
内存回收器,在执行完一个函数时:
会释放栈内指类型,
和部分明显的一代堆引用对象( 比如对象的引用,申明,使用 都只是在函数内且没有被其他引用,这种对象 是很容易被释放的);第二种代码的死循环,函数永不离开,开辟的对象(值类型,引用类型)都会不停的堆积。
第一种代码的死循环,开辟的数据其实在离开 BBB 方法时,会被有效释放,是否释放完不得而知,但肯定释放得多!
其实这个可以不用考虑的,在运行结束后会自动回收的,使用GC也不是及时回收的