`
halloffame
  • 浏览: 55550 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于java gc和有close方法的对象

    博客分类:
  • java
阅读更多

我们知道有些java对象比如socket,io流等是有close方法的,一般可以在finally块内调用然后释放资源,假如我们忘记调用close方法,当java gc这个对象的时候也会释放资源,不过java gc是不能确定时间的,所以最好用完了就手工close一下。

 

下面我们用ServerSocket的例子来证明垃圾回收是会释放内存和端口的:

import java.net.ServerSocket;

public class TestSocketGc {
	public static void main(String[] args) throws Exception {
		System.out.println("start");
		sub();
		
		//sub里面的serverSocket此时超出作用域了,通知jvm可以gc一下
		//如果不手工gc一下,假设内存资源充足,jvm也不会自动gc
		System.gc(); 
		
		//休息一下让jvm有时间回收sub里面的serverSocket
		Thread.sleep(3000); 
		
		/**
		 * 如果注释掉上面两句,没释放资源,
		 * 因为端口占用,下面一句将抛异常:
		 * java.net.BindException: Address already in use: JVM_Bind
		 */
		ServerSocket serverSocket = new ServerSocket(4567);
		System.out.println("end");
	}
	
	public static void sub() throws Exception {
		ServerSocket serverSocket = new ServerSocket(4567);
		//serverSocket.close();
		//serverSocket = null;
		//System.gc();
	}
	
}

 

谢谢!!!

1
1
分享到:
评论
2 楼 halloffame 2017-04-28  
somefuture 写道
你只是想说不close也可以吗

是这个意思,但是不手动close的话,要等jvm垃圾回收才能释放掉占用的端口,那jvm什么时候垃圾回收就不能确定时间了,所以最好手工close掉这类对象,免得端口资源被占用。
1 楼 somefuture 2017-04-26  
你只是想说不close也可以吗

相关推荐

    java内存泄露相关资料

    例如,使用DataSource.getConnection()创建的Java数据库连接必须用Close()方法关闭。对于ResultSet和Statement对象,虽然它们会在Connection关闭时自动关闭,但如果使用连接池,需要显式关闭这三个对象以避免内存...

    java考试题.pdf

    2. Java中的类和对象:文件中出现了与类定义和对象创建相关的知识点,例如“abstract”表示抽象类或方法,以及类的构造方法(ConstructTest类的构造函数)和方法的定义。在Java中,类是由方法和属性组成,可以实现...

    java内存泄露总结

    此外,Java使用有向图来维护对象之间的引用关系,帮助识别引用循环等问题,确保即使存在循环引用也能正确回收对象。 #### 二、Java内存泄露的原因 尽管Java的自动内存管理非常强大,但在某些特定情况下仍可能出现...

    java初始化和清理

    因此,对于资源的清理,Java推荐使用try-with-resources语句或者显式地关闭资源,如使用InputStream.close()方法关闭输入流,确保及时释放资源。 内存泄露是Java开发中需要特别关注的问题,内存泄露指的是程序中己...

    计算器界面java设计

    根据给定的文件信息,我们可以总结出以下关于“计算器界面Java设计”的相关知识点: ### 1. 导入必要的库 在Java程序中,我们首先需要导入必要的库,以便使用图形用户界面(GUI)组件。 ```java import java.awt....

    java避免内存泄露

    在Java中,由于具备垃圾回收机制(GC),理论上开发者不必担心内存泄露问题。然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、...

    一文详解java内存管理机的垃圾标记.docx

    Java内存管理机制的核心任务是确保高效地使用内存,特别是如何识别和回收不再使用的对象,以避免内存泄漏。本文将深入探讨这一主题,重点关注垃圾标记的过程。 首先,我们要明白JVM如何确定哪些对象是存活的。有两...

    Java基础知识小结

    - **接口**:只包含抽象方法(默认情况下),没有实例变量,不能有构造函数,可以包含静态方法和默认方法(Java 8及以上版本)。 #### 1.12 面向对象设计61点经验原则 面向对象设计的原则是指导软件工程师设计高...

    JavaOOP(1)_java_trick6wf_zip_

    类是创建对象的模板,定义了一组属性(数据成员)和方法(成员函数)。对象则是类的实例,具有类定义的属性和行为。在Java中,我们使用`class`关键字来定义类。 ```java public class Car { String brand; int ...

    java 笔记 JDBC

    【Java JDBC 访问数据库】 Java JDBC (Java Database ...Java提供了不同的GC策略和垃圾收集器,如Serial、Parallel、CMS和G1等,以适应不同性能需求的应用场景。开发者可以通过配置JVM参数来调整GC的行为。

    java面试题及答案

    **答案:** Java 的垃圾回收机制(Garbage Collection, GC)是一种自动内存管理机制,用于跟踪和释放不再使用的对象所占用的内存空间。Java 的虚拟机(JVM)会在适当的时候自动触发垃圾回收过程,从而避免了手动释放...

    Java Monitor Pattern设计模式

    Java 监视器模式(Java Monitor Pattern)是一种用于多线程环境中的设计模式,它主要依赖于Java语言的同步机制,如`synchronized`关键字和`wait()`, `notify()`等方法,来确保线程安全和资源的有序访问。在Java中,...

    JAVA常见的面试题

    - 创建对象:newInstance()方法和Constructor的使用。 - 访问成员:获取和设置字段,调用方法。 7. **网络编程** - Socket编程:客户端和服务器端的建立连接,数据传输。 - HTTP协议:理解GET和POST请求,以及...

    鑫合易家Java初级试卷2-题目.docx鑫合易家Java初级试卷2-题目.docx

    不过,从给出的部分来看,这是一个关于类继承和方法重写的示例。 **总结:** 以上是对给定文件中部分知识点的详细解析,涵盖了Java语言的基础概念、异常处理、数据结构、Web开发等方面。希望这些解析能够帮助理解和...

    Java内存泄漏问题相关总结

    使用FileOutputStream、PrintStream等流对象时,务必记得在完成操作后调用close()方法关闭流,否则资源无法释放。确保在finally块中关闭流,以防止异常情况下未关闭流。 5. **监听器**: 添加到系统偏好或其他...

    java代码编写建议

    重写`equals()`、`hashCode()`和`toString()`等方法是Java编程中的常见实践。这些方法用于比较对象的相等性、计算对象的哈希码以及返回对象的字符串表示。正确实现这些方法可以增强类的功能性和互操作性。例如,`...

    Java9垃圾回收方法finalize() 原理解析

    Java9垃圾回收方法中的finalize()方法是一个特殊的方法,它是Object类中的方法,用于在类被GC回收时做一些处理操作。finalize()方法的主要作用是释放对象占用的资源,例如关闭文件、释放Socket等。但是,finalize()...

    javacore测试题.docjavacore测试题.doc

    12. abstract class 可包含抽象方法和具体方法,可以有构造器,支持继承。interface 只能包含抽象方法和常量,不允许有实现,支持多继承。 13. GC (Garbage Collector) 是垃圾收集器,负责自动回收不再使用的对象...

Global site tag (gtag.js) - Google Analytics