VB.net2000的自动垃圾回收机制到底管用么???????!!!!

作者&投稿:郦董 (若有异议请与网页底部的电邮联系)
C#中垃圾回收机制原理是什么~

首先说下C#中的变量类型吧,C#中有2个变量类型,一种是值类型,一种是引用类型,值类型是在栈上创建,这一类型用不到GC,引用类型是在堆中创建,GC主要是在这里管理对象。GC对每个对象有个引用计数,所有说只要有变量在引用它,计数器就不为了,一个变量不再引用这个对象,对象的计数器就减一,知道计数器为0时,对象就成为内存垃圾了(没有变量引用它),但是此时垃圾并没有回收。那什么时候回收呢,是在内存占用超过一定限度是,GC才启动,释放垃圾资源,说白了就是delete这些对象,将空间归还给系统。但是这还没完,空间释放后,内存空间就不连续了,所有GC还要赶一件事,就是将空间整理下,将占用的空间连续话,具体说就是将空间向上推,就是想高地值转存,这样空间就连续了,使用也方便了,然后GC就改变应用那些对象的变量里地地址,让他们指向正确的位置,所以说C#中的引用类型就是一种指针,一种动态改变值的指针。

java中垃圾回收机制的原理
推荐一篇文章:
对高性能JAVA代码之内存管理
更甚者你写的代码,GC根本就回收不了,直接系统挂掉。GC是一段程序,不是智能,他只回收他认为的垃圾,而不是回收你认为的垃圾。
GC垃圾回收:
Grabage Collection相信学过JAVA的人都知道这个是什么意思。但是他是如何工作的呢?
首先,JVM在管理内存的时候对于变量的管理总是分新对象和老对象。新对象也就是开发者new出来的对象,但是由于生命周期短,那么他占用的内存并不是马上释放,而是被标记为老对象,这个时候该对象还是要存在一段时间。然后由JVM决定他是否是垃圾对象,并进行回收。
所以我们可以知道,垃圾内存并不是用完了马上就被释放,所以就会产生内存释放不及时的现象,从而降低了内存的使用。而当程序浩大的时候。这种现象更为明显,并且GC的工作也是需要消耗资源的。所以,也就会产生内存浪费。
JVM中的对象生命周期里谈内存回收:
对象的生命周期一般分为7个阶段:创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段。
创建阶段:首先大家看一下,如下两段代码:
test1:
for( int i=0; i《10000; i++)
Object obj=new Object();
test2:
Object obj=null;
for( int i=0; i《10000; i++)
obj=new Object();
这两段代码都是相同的功能,但是显然test2的性能要比test1性能要好,内存使用率要高,这是为什么呢?原因很简单,test1每次执行for循环都要创建一个Object的临时对象,但是这些临时对象由于JVM的GC不能马上销毁,所以他们还要存在很长时间,而test2则只是在内存中保存一份对象的引用,而不必创建大量新临时变量,从而降低了内存的使用。
另外不要对同一个对象初始化多次。例如:
public class A{
private Hashtable table = new Hashtable();
public A(){ table = new Hashtable();
// 这里应该去掉,因为table已经被初始化。
}
这样就new了两个Hashtable,但是却只使用了一个。另外一个则没有被引用。而被忽略掉。浪费了内存。并且由于进行了两次new操作。也影响了代码的执行速度。
应用阶段:即该对象至少有一个引用在维护他。
不可视阶段:即超出该变量的作用域。这里有一个很好的做法,因为JVM在GC的时候并不是马上进行回收,而是要判断对象是否被其他引用在维护。所以,这个时候如果我们在使用完一个对象以后对其obj=null或者obj.doSomething()操作,将其标记为空,可以帮助JVM及时发现这个垃圾对象。
不可到达阶段:就是在JVM中找不到对该对象的直接或者间接的引用。
可收集阶段,终结阶段,释放阶段:此为回收器发现该对象不可到达,finalize方法已经被执行,或者对象空间已被重用的时候。
JAVA的析构方法:
可能不会有人相信,JAVA有析构函数? 是的,有。因为JAVA所有类都继承至Object类,而finalize就是Object类的一个方法,这个方法在JAVA中就是类似于C++析构函数。一般来说可以通过重载finalize方法的形式才释放类中对象。如:
public class A{
public Object a;
public A(){ a = new Object ;}
protected void finalize() throws java.lang.Throwable{
a = null; // 标记为空,释放对象
super.finalize(); // 递归调用超类中的finalize方法。
}
}
当然,什么时候该方法被调用是由JVM来决定的。..。..。..。..。..。..。..。.
一般来说,我们需要创建一个destory的方法来显式的调用该方法。然后在finalize也对该方法进行调用,实现双保险的做法。
由于对象的创建是递归式的,也就是先调用超级类的构造,然后依次向下递归调用构造函数,所以应该避免在类的构造函数中初始化变量,这样可以避免不必要的创建对象造成不必要的内存消耗。当然这里也就看出来接口的优势。
数组的创建:
由于数组需要给定一个长度,所以在不确定数据数量的时候经常会创建过大,或过小的数组的现象。造成不必要的内存浪费,所以可以通过软引用的方式来告诉JVM及时回收该内存。(软引用,具体查资料)。
例如:
Object obj = new char[10000000000000000];
SoftReference ref = new SoftReference(obj);
共享静态存储空间:
我们都知道静态变量在程序运行期间其内存是共享的,因此有时候为了节约内存工件,将一些变量声明为静态变量确实可以起到节约内存空间的作用。但是由于静态变量生命周期很长,不易被系统回收,所以使用静态变量要合理,不能盲目的使用。以免适得其反。
因此建议在下面情况下使用:
1,变量所包含的对象体积较大,占用内存过多。
2,变量所包含对象生命周期较长。
3,变量所包含数据稳定。
4,该类的对象实例有对该变量所包含的对象的共享需求。(也就是说是否需要作为全局变量)。
对象重用与GC:
有的时候,如数据库操作对象,一般情况下我们都需要在各个不同模块间使用,所以这样的对象需要进行重用以提高性能。也有效的避免了反复创建对象引起的性能下降。
一般来说对象池是一个不错的注意。如下:
public abstarct class ObjectPool{
private Hashtable locked,unlocked;
private long expirationTime;
abstract Object create();
abstract void expire( Object o);
abstract void validate( Object o);
synchronized Object getObject(){。..};
synchronized void freeObject(Object o){。..};
这样我们就完成了一个对象池,我们可以将通过对应的方法来存取删除所需对象。来维护这快内存提高内存重用。
当然也可以通过调用System.gc()强制系统进行垃圾回收操作。当然这样的代价是需要消耗一些cpu资源。
不要提前创建对象:
尽量在需要的时候创建对象,重复的分配,构造对象可能会因为垃圾回收做额外的工作降低性能。
JVM内存参数调优:
强制内存回收对于系统自动的内存回收机制会产生负面影响,会加大系统自动回收的处理时间,所以应该尽量避免显式使用System.gc(),
JVM的设置可以提高系统的性能。例如:
java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m
具体可以查看java帮助文档。我们主要介绍程序设计方面的性能提高。
JAVA程序设计中有关内存管理的其他经验:
根据JVM内存管理的工作原理,可以通过一些技巧和方式让JVM做GC处理时更加有效。,从而提高内存使用和缩短GC的执行时间。
1,尽早释放无用对象的引用。即在不使用对象的引用后设置为空,可以加速GC的工作。(当然如果是返回值。..。.)
2,尽量少用finalize函数,此函数是JAVA给程序员提供的一个释放对象或资源的机会,但是却会加大GC工作量。
3,如果需要使用到图片,可以使用soft应用类型,它可以尽可能将图片读入内存而不引起OutOfMemory.
4,注意集合数据类型的数据结构,往往数据结构越复杂,GC工作量更大,处理更复杂。
5,尽量避免在默认构造器(构造函数)中创建,初始化大量的对象。
6,尽量避免强制系统做垃圾回收。会增加系统做垃圾回收的最终时间降低性能。
7,尽量避免显式申请数组,如果不得不申请数组的话,要尽量准确估算数组大小。
8,如果在做远程方法调用。要尽量减少传递的对象大小。或者使用瞬间值避免不必要数据的传递。
9,尽量在合适的情况下使用对象池来提高系统性能减少内存开销,当然,对象池不能过于庞大,会适得其反.

很简单,你没有正确理解VB.net的内存自动回收机制,仔细看一下MSDN,好好研究一下相关的内容。其实JAVA的内存自动回收机制与VB.net是类似的,如果你用VB.NET做不好,换用JAVA照样做不好。

其实,你已经发现了为什么内存不能回收,只是你没意识到罢了。
为什么要用全局变量呢?给你举个极端的例子吧:建立一个全局的Hashtable,然后将程序中创建的每一个对象实例加入到这个hashtable中,那么你将看到内存一直猛增,直到崩溃。

正确的作法是:
1、尽量不用、少用全局变量和静态变量
2、如果没有必要,就不要把对象实例加到全局或静态的Hashtable、ArrayList之类的集合中去,除非你是想自己建立一个对象缓冲池
3、如果你自己要建立对象缓冲池,就一定要注意对象的清理,尽早将不用的对象从池中删除
4、找本好一点的数据结构,仔细学学其中关于自动内存回收的那几种机制,以后在程序中不要违反它们的要求前提条件。

你先试试整理虚拟内存所用的驱动盘,然后再重启,如果还不行,没有办法,尝试重装VS.NET,可能是内存回收系统出现故障了。
其实如果你用VB的话可以用VB6,这是个超级经典的编译器,而且它不是使用.NET Frameworks构架,因此不会涉及内存整理,而且本人认为VB6的代码比VB.NET明了多了,.NET的只是更加突出对象罢了。
那个Me.Refresh()的意思是刷新当前窗体,只是对窗体的外观进行一次刷新,和内存没多大关系

DELEAT


C\/s。 B\/s。 Qt。 构架的区别还有那个比较好。 想做手机端的软件构建...
B\/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C\/S有更高的要求,B\/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000Exchange2000等,全面支持网络的构件搭建的系统。SUN和IBM推的JavaBean构件技术等,使B\/S更加成熟。(4)、软件重用不同C\/S程序可以不可避免的整体性考虑,构件的...

宝儿是谁能介绍一下吗
2000年08月 8月25日首张专辑"ID:Peace B"发表第一辑,迅速征服了众多歌迷。出道时不足14岁。 2000年10月 签约BoryungMedience[Gienic White C]担任C.E.模特6个月、签约Onse通信[SSHARK]担任CF模特6个月、签约HAITAI[chocotintin]担任CF模特6个月 2000年11月 11月24日获得M.net 2000音乐电视"最佳女子新人...

boa的发展历程
2000年08月 8月25日首张专辑"ID:Peace B"发表第一辑,迅速征服了众多歌迷。出道时不足14岁。2000年10月 签约BoryungMedience[Gienic White C]担任C.E.模特6个月、签约Onse通信[SSHARK]担任CF模特6个月、签约HAITAI[chocotintin]担任CF模特6个月2000年11月 11月24日获得M.net 2000音乐电视"最佳女子新人奖...

什么是netbios?
NBT的基本思想是在基于IP的络上模拟基于NetBIOS的PC-Network。NBT在Windows 2000中引入,是现在首选的NetBIOS传输。 概述不管使用哪一种传输方式,NetBIOS提供三种不同的服务: 名字服务:名字登记和解析 会话服务:可靠的基于连接的通信 数据包服务:不可靠的无连接通信 当NetBIOS是数据链路层协议时,可以通过5Ch中断访...

2000系统在局域网中不能被访问,急!
若要解决该问题,请确保工作组中的每台计算机都打开 TCP\/IP 上的 NetBIOS 并运行"计算机浏览器"服务。为此,请按照下列步骤操作。第 1 步:打开 TCP\/IP 上的 NetBIOS a. 单击开始,单击控制面板,然后单击"网络和 Internet 连接"。b. 单击网络连接。c. 右击本地连接,然后单击属性。d. 单击 ...

lbs和es的区别
lbs和es的区别:1.含义不同---B\/S:浏览器\/服务器(Browse\/Server)结构,C\/S:客户机\/服务器(Client\/Server)结构.2.成本不同---B\/S结构只需要升级服务器系统,重新登录即可,维护成本低;C\/S结构需要针对不同的客户端开发不同的程序,需要进行安装、调试和升级,维护成本高 3.安全不同---B...

b\/s c\/s的区别是什么?
4、对程序架构不同 C\/S 程序更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑。B\/S对安全以及访问速度的多重考虑, 建立在需要更加优化的基础之上。 比C\/S有更高的要求 B\/S结构的程序架构是发展的趋势, 从MS的。Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件...

b\/s和c\/s
一种全新的软体系统构造技术,随着Windows 98\/Windows 2000将浏览器技术植入作业系统内部,这种结构更成为当今应用软体的首选体系结构。B\/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C\/S有更高的要求 B\/S结构的程式架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange ...

简述C\/S和B\/S模式的区别
B \/ S对安全性和访问速度的多重考虑是基于对更多优化的需求。从MS的.Net系列开始,具有比C \/ S更高要求的程序架构是一种发展趋势。 BizTalk 2000 Exchange 2000等,完全支持网络组件构建系统。 SUN和IBM推出JavaBean组件技术等,使B \/ S更加成熟。5,软件重用是不同的:C \/ S程序不可避免地被视...

b\/s 与c\/s的区别
综述:两者区别B\/S就是“Browser\/Server”的缩写,即“浏览器\/服务器”模式。C是英文单词“Client”的首字母,即客户端的意思,C\/S就是“Client\/Server”的缩写,即“客户端\/服务器”模式。C\/S结构是一种软件系统体系结构,也是生活中很常见的。这种结构是将需要处理的业务合理地分配到客户端和服务...

石门县19737055950: vb.net 内存回收机制.... -
须送卫昕: 一般.net的垃圾回收机制会在过程结束后进行垃圾回收,但是垃圾回收是比较消耗系统资源的,所以不可能经常被调用. 如果你需要强制进行垃圾回收,可在过程最后添加如下代码: GC.Collect()强制进行垃圾回收

石门县19737055950: 跪求大神指点vb.net 怎么释放变量在内存中的残留地址值呀 -
须送卫昕: .net 有自己的资源回收机制GC.如果变量不再使用了,所有引用该变量的其它变量也都没用了(dispose或者赋值为空了),那么这些没用的变量会定时的被GC自动回收,不需要自己去管理.如果非要自己释放资源的话,可以使用 GC.Collect() 进行释放,但是并不能保证一次GC.Collect()就可以释放掉所有没有用的资源,可能要经过好几轮GC.Collect()才能释放干净.所以还是建议不要手动回收了,让系统根据要求自动回收吧.

石门县19737055950: vb.net问题 -
须送卫昕: me.dispose是最彻底释放资源; Me.Close 是关闭 end 只是结束 一般用在程序的语句中,如结束语句.执行 dispose 后,由.net 的GC垃圾回收器周期性地回收资源, me.close 方法的基类会调用 dispose 方法end 是从vb中继承下来的语句,直接指示退出程序.程序的资源将被释放,程序并未希望结束时,不适合使用该方法.若要强行退出应用程序,

石门县19737055950: 在.net中什么是一种自动回收内存的机制 -
须送卫昕: .net中的垃圾回收机制是GC,是受托管的对象.程序员不需要手动干预GC垃圾回收的过程,GC会自动回收托管堆上不会再使用的对象所占用的内容,并且移动仍在被使用的活动对象,从而使它们所占的内存空间保持连续.虽然不需要手动干预GC垃圾回收的过程,但.NET中的CLR仍然提供了一个手动执行垃圾回收的GC.Collect()方法.但不建议程序员调用此方法.GC回收是一个相当耗费资源的过程,程序员应尽量减少不必要的垃圾回收次数.

石门县19737055950: .net释放内存的代码怎么写!(vb.net c#) -
须送卫昕: .net 大多数情况下不需要自己管理内存,但是调用 Dispose() 方法是一个好习惯.不用的对象就把它们的引用设为空(VB 是 Nothing,C# 是 null),这样 .net 的垃圾回收器就会去处理它们.

石门县19737055950: 如何理解.net中的垃圾回收机制 -
须送卫昕: 有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的.尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如何工作的.这篇文章我们就来看下.Net是如何...

石门县19737055950: .net中的垃圾回收机制.
须送卫昕: 垃圾回收机制.简单理解就是.有一些东西你没用了.但是没有释放掉资源.系统会自动是否掉那些你没有释放的资源.这是一个优势. 对比下.在C++中.程序员要用代码释放资源的.一个不小心没考虑好,程序就会崩溃.

石门县19737055950: 用最简单的代码介绍一下指针在VB.net里面的用法? -
须送卫昕: 例1:以下程序我们申请几个指向不同类型的指针:'使用属性告诉net编译器:结构的元素在内存中按其出现的顺序排列 _ Public Structure DEFUDT_Test Public bytb As Byte Public i32a As Int32 End Structure Public Function fnGetIntptr1() As ...

石门县19737055950: java垃圾回收机制 -
须送卫昕: 垃圾回收可以简单的理解为:虚拟机自动回收你曾经声明过,但不使用了的那些变量. 一般来说垃圾回收是不需要人工干预的,虚拟机会自动的操作这个过程. 有的时候可以通过gc对象来手工通知虚拟机来回收垃圾.但并不能保证垃圾回收器会立马回收内存.

石门县19737055950: java中的垃圾回收机制是怎样的? -
须送卫昕: java 的垃圾回收机制:1.垃圾回收是由虚拟机自动执行,不能人为地干预.2.系统比较空闲(垃圾回收线程)3.对象不在被引用.对象处于引用的隔离岛状态(隔离引用),对象具备了回收的条件4.gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网