java垃圾回收器,JAVA的垃圾回收机制优点和原理并考虑2种回收机制
来源:整理 编辑:皮来回收 2024-07-24 04:29:18
本文目录一览
1,JAVA的垃圾回收机制优点和原理并考虑2种回收机制
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
2,java 有resharper 这种软件么
ReSharper是一个JetBrains公司出品的著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE。它包括一系列丰富的能大大增加C#和Visual Basic .net开发者生产力的特征。使用ReSharper,你可以进行深度代码分析,智能代码协助,实时错误代码高亮显示,解决方案范围内代码分析,快速代码更正,一步完成代码格式化和清理,业界领先的自动代码重构,高级的集成单元测试方案,和强大的解决方案内导航和搜索。实质上,ReSharper特征可用于C#,VB.NET,XML,ASP.NET,XAML,和构建脚本。ReSharper还为C#和VB.NET提供了增强的交叉语言功能,它使开发者可以有效的控制.net混合项目。
3,这段代码为什么Paint paintnew Paint这句语句会报出警告
这个警告信息是 Android Lint 给出的,不是标准java的警告.View 的 onDraw() 方法会被频繁的调用,android给出这个警告的意思是,不建议开发者在onDraw()函数体内进行对象分配.如果在其中有需要用到的对象,应该把这些对象的分配放在别处.比如楼主这个问题,就可以在构造函数里初始化一个类的成员变量mPaint,在onDraw()函数体内只对其调用setColor(),不进行new操作.按谷歌的解释,避免在onDraw()内分配对象,是为了减少垃圾回收器对绘图性能的影响.我查了一下,Android所用的Dalvik虚拟机,其垃圾回收器工作时是需要 stop the world 的.意思是说,垃圾回收器工作时,会停止此虚拟机中的一切线程,等垃圾回收器工作完成,程序线程才能再次工作.而垃圾回收最活跃的地方,必然是堆内存上,也就是new操作产生的内存占用.所以在onDraw()函数体内尽量少new对象出来,就可以尽量减少虚拟机 stop the world 的时间.如不明白建议百度下java垃圾回收器的工作方式,大体了解下.onDraw()调用到底有多频繁?你把你的这个view放进一个ScrollView里,然后在onDraw()里加一行log,然后滚动你的屏幕,看着海量的log输出,就会有些体会了.
4,JAVA中垃圾收集的问题会JAVA的进
使用一个你知道它有与之相关联的本地资源(例如,一个GUI组件,文件,套接字)的对象,那么在使用完之后,一定要调用它的dispose()或equivalent方法。这将保证立即回收本地资源并且减小这些资源流失的可能性。finalize是Java编程语言的一个特性:它允许你对垃圾收集器发现的不可达的对象进行最后清理。典型地用于回收与一对象相关联的本地资源。下面是一个简单的finalize示例:public class Image1 //指向本地图像数据 private int nativeImg; private Point pos; private Dimension dim; //它释放本地图像; //随后对它的调用将被忽略 private native void disposeNative(); public void dispose() protected void finalize() static private Image1 randomImg;}垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中任何一个 " 活动的部分 " 所引用,此时我们就说,该对象的内存空间已经无用。所谓 " 活动的部分 " ,是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕。 rectangle rectangle = new rectangle(point, 20, 20); //这里,rectangle还要用它
5,Java中垃圾回收机制
java的垃圾回收,是自动处理的,如果你是高手也可以手动处理!不是每完成一个方法,回收一次垃圾,就会提高性能。相反,垃圾回收,也需要消耗性能,如果频繁使用,反而使性能降低!gc()是随机回收垃圾的,谁也无法预料它到底什么时候来。 给你写个例子看看那 public class testfinalize public static void main(string[] args) while(true) teacher tea = new teacher("robin",30); // teacher tea1 =new teacher("j"); system.gc(); //runtime.getruntime().gc(); } }}class teacher string name; int age; public teacher(string name,int age) this.name = name; this.age = age; system.out.println("一个老师站起来====="); } @override public void finalize() system.out.println("一个老师倒下去"); }}Java中的垃圾回收机制由虚拟机负责,按照一定的算法进行,就算你手动调用了System.gc(),也不会让垃圾收集器立即执行,这种执行是不确定的,再者如楼上所说垃圾回收器会带来程序性能问题,如果你想帮助回收可以把相应的引用置为null
6,java堆栈是啥
简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象Java把内存分成两种,一种叫做栈内存,一种叫做堆内存:在执行过程中会划分4个内存区域(heap、stack、data segment、code segment)。java开始执行会把代码加载到code segment区域然后找到main方法开始执行;data segment是存放静态变量字符串常量;stack(堆):是存放局部变量等;heap(栈):放new出来的东西;举例:Student zhidao=new Student();//zhidao是对象的引用,它存放在栈中。//可以把它理解为一个指针,指向所存放在堆中的对象。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。java在执行过程中会划分4个内存区域(heap、stack、data segment、code segment)java开始执行会把代码加载到code segment区域然后找到main方法开始执行data segment是存放静态变量字符串常量stack(堆):是存放局部变量等heap(栈):放new出来的东西举例:Student st1=new Student();st1是对象的引用,它存放在栈中。可以把它理解为一个指针,指向所存放在堆中的对象。而int,double,float等原始数据类型则存放在栈中。这是由于分配栈的速度比分配堆的速度快的多,而这些数据经常使用。这个问题太深奥了,即使给你说了你也不一定懂,当年我学这东西的时候讲到“栈”这个概念时久没听懂。很难懂,很专业Java中堆栈的概念是逻辑上的,在完全符合Java规范的Java处理器面世之前,所有Java虚拟机提供的内容都是由软件模拟出来的。 什么叫堆?你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张。 什么叫栈?AK-47的弹匣就是一个栈,在上面的子弹没被取出之前,你无法取出下面的子弹——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子弹。 堆很灵活,但是不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。 栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。 在Java中,引用可以理解为一个永远指向对象的指针,Java没有指向指针的指针。 关于堆栈的资料几乎每个讲数据结构的书上都有,而至于Java中堆、栈的具体机制你可以参考一些关于Java虚拟机原理的书,不过这个好像比较难理解,我是没指望理解的了。 以上都是我的个人观点,仅供参考。
文章TAG:
java 垃圾 垃圾回收 垃圾回收器 java垃圾回收器