finalize

Java 内存回收机制

孤街醉人 提交于 2020-01-02 00:30:31
  当执行构造方法生成一个对象时,需要占用各种系统资源。当生成的对象不再使用时,就需要返回给操作系统,以免资源的泄露。在各种系统资源中,最常使用的就是内存。Java运行时系统通过垃圾收集周期性地释放无用对象所使用的内存。当一个对象在程序中不再使用时,即当前的代码段不属于对象的作用域或把对象的引用赋值为空,则该对象就成了一个无用的对象。Java的垃圾收集器自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收。垃圾收集器作为一个线程运行。当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。C语言中通过free来释放内存,C++中则通过delete来释放内存,如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存的耗尽。在Java中不会发生内存泄漏情况,但对于其他资源,则有产生泄露的可能性。   Java中的每一个类都有一个finalize()方法用于释放资源,在对对象进行自动垃圾回收前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源,如关闭打开的文件或socket等。该方法的声明格式如下:    protected void finalize() throws throwable   finalize()方法在java.lang.Object中声明

How to implement finalize() in kotlin?

旧街凉风 提交于 2020-01-01 07:39:37
问题 Today I'm implementing a Closeable in kotlin, and as I have done in java in the past, I want to implement a finalize() as a last resort fallback in case the client code forgets to close it, rendering critical resource un-reclaimed. I consider this resource critical enough to add this fallback, despite the unreliability of this fallback. However, kotlin.Any does not declare a finalize method, which means I can't simplydo this: class Resource: Closeable { fun close() {} override fun finalize()

How to implement finalize() in kotlin?

北城以北 提交于 2020-01-01 07:39:03
问题 Today I'm implementing a Closeable in kotlin, and as I have done in java in the past, I want to implement a finalize() as a last resort fallback in case the client code forgets to close it, rendering critical resource un-reclaimed. I consider this resource critical enough to add this fallback, despite the unreliability of this fallback. However, kotlin.Any does not declare a finalize method, which means I can't simplydo this: class Resource: Closeable { fun close() {} override fun finalize()

JVM学习笔记(二):垃圾收集

限于喜欢 提交于 2019-12-29 02:31:02
程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生,随线程而灭; 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 而 Java堆和方法区 则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存。 自动垃圾回收机制就是寻找Java堆中的对象,并对对象进行分类判别,寻找出正在使用的对象和已经不会使用的对象,然后把那些不会使用的对象从堆上清除。 一、哪些对象需要回收 1. 引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个对象引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 但 主流Java虚拟机中并没有采用引用计数算法 ,原因:它很难解决对象之间相互循环引用的问题。 例: /** * 添加参数:-XX:+PrintGC * testGC()方法执行后,objA和objB会不会被GC呢? * */ public class

.net平台下垃圾回收机制

℡╲_俬逩灬. 提交于 2019-12-29 02:28:37
  新手可以看一看,大牛可以关闭浏览页了。    引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了。但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了。在.net平台下CLR负责管理内存,CLR中的垃圾收集器GC:Garbage Collection,负责执行内存的清理工作,但是GC也只是负责清理托管堆上的垃圾对象,而对于非托管的资源对象,GC则不起作用,必须要程序开发者手动清理。此处需要稍微说明:一般而言,非托管资源主要包括数据库链接、文件句柄、COM对象、套接字、GDI+对象、互斥体等等。 在介绍GC前,有必要对.net中CLR管理内存区域做简要介绍:   1、 堆栈:用于分配值类型实例。堆栈主要操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。   2 、GC堆:用于分配小对象实例。如果引用类型对象实例的大小小于85000字节,实例将被配置在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩。   3、 LOH:large object heap,用于分配大对象实例。如果引用类型对象的实例的大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,而且只在完全GC回收时被回收。      既然要清理垃圾

In Java, what purpose do the keywords `final`, `finally` and `finalize` fulfil?

好久不见. 提交于 2019-12-29 02:17:08
问题 In Java, what purpose do the keywords final , finally and finalize fulfil? 回答1: final final can be used to mark a variable "unchangeable" private final String name = "foo"; //the reference name can never change final can also make a method not "overrideable" public final String toString() { return "NULL"; } final can also make a class not "inheritable". i.e. the class can not be subclassed. public final class finalClass {...} public class classNotAllowed extends finalClass {...} // Not

Finalize() 和 Dispose()

六月ゝ 毕业季﹏ 提交于 2019-12-27 10:18:46
引用: http://www.7dspace.com/doc/24/0603/20063604160336160.htm http://www.yesky.com/20030311/1656401_1.shtml MSDN垃圾回收专题: http://msdn2.microsoft.com/zh-cn/library/0xy59wtx.aspx 一般在.NET程序中创建的托管对象,都是可以依靠GC来自动回收;但是当对象中封装了非托管资源时,就需要自己来释放。 对非托管资源的释放,可以通过Finalize()方法和IDisposable接口的Dispose()方法来实现。 Finalize() * 析构函数会在编译时会被翻译为protected void Finalize(),这是C#的析构函数的语法 GC在回收对象之前会调用Finalize()来实现非托管资源的释放,不过按照MSDN的说法,Finalize()会导致性能的降低。 “垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。   实现 Finalize 方法或析构函数对性能可能会有负面影响

java杂项

本秂侑毒 提交于 2019-12-25 19:29:05
简单介绍==和equals区别 ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同 final, finally, finalize的区别 final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 java中的sleep()和wait(

C#内存管理和垃圾回收机制

淺唱寂寞╮ 提交于 2019-12-25 11:03:38
数据类型 垃圾回收机制 一、数据类型 C#中的数据类型分为 值类型 (Value type) 和 引用类型(reference type) , 值 类 型: 所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在 堆栈( Stack,先进后出 ) 上,常见的值类型有:整形、浮点型、bool、枚举等。 引用类型: 所有的引用类型都继承自System.Object 上,引用类型保存在 托管堆(Head,先进先出) 上,常见的类型有:数组、字符串、接口、委托、object等。 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。 拆箱: 拆箱就是将一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 装箱: 装箱就是隐式的将一个值型转换为引用型对象。比如: int i=0; Syste.Object obj=i; 二、垃圾回收机制 GC   1、简介 C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage Collect)进行系统资源回收,在数据基本类型中介绍到,C#数据类型分为引用类型和值类型, 值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象

浅谈CLR的内存分配和回收机制

不想你离开。 提交于 2019-12-25 11:03:22
相对于C++程序员来说,C#程序员是非常幸运的,至少我们不需要为内存泄漏(Memory Leak)而头疼,不需要负责内存的分配和回收。但这不意味着我们只需要知道new的语法就可以了,作为一个严肃的C#程序员,我们应该对此有所了解,有助于我们编写性能更好的代码。 主要内容: CLR的内存分配机制 CLR的回收机制 一、CLR的内存分配机制 .NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。 ... object obj = new object(); ... 但是,内存不是无限大的。 public void FillMemory() { ArrayList memory = new ArrayList(); // 输出填充前所占内存大小 Console.WriteLine("used memory:" + GC.GetTotalMemory(false)); for (int i = 0; i < 100000; i++) { memory.Add(new object()); } // 输出填充后所占的内存大小 Console.WriteLine("used memory:" + GC.GetTotalMemory(false));