Java学习笔记(二)——流程,内存管理

本文深入探讨了Java编程中switch语句的使用要点、异常处理机制,以及垃圾回收原理与实践。主要内容包括switch语句的常量使用规则、整数表达式的限制、try-catch-finally的正确使用、手动引发和定义异常、Throwable类的层级关系、垃圾回收器的工作机制、对象内存空间的判断标准、垃圾回收器的特性与行为、finalize()方法的作用与限制、垃圾回收的触发与效果等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.switch语句,在使用case关键字时,需要注意2点:(1)跟在case后面的值必须是个常量,不能是变量或者表达式;(2)一个case后面一般要接一个break语句才能结束判断.

 

2.switch(expr)中,expr是一个整数表达式,.因此传递给switch和case语句的参数应该是int,short,char或者byte.

long,String都不能作用于switch.

 

3.在Java中,try和catch可以连用,try-catch-finally可以连用,但是try,catch,finally这三个关键字却不能单独使用.如果在程序中只想try而不去catch是可以的,但是try的后面必须跟有finally.

 

4.throw关键字用来手动引发一个异常.throws关键字用来定义任何被调用方法的异常.

 

5.Java的lang包里有一个Throwable类,它是所有异常的父类或者间接父类.每个异常类型都市Throwable类的子类,这其中有2个常用子类:Error和Exception.Error类及其子类用来处理系统内部以及程序运行环境的异常,一般与硬件有关,由系统直接处理,不需要程序员在程序中处理.Exception类是程序能够捕获到的异常情况.它又分为2大类:运行时异常(RuntimeException)和检查型异常(checked exception 也成非运行时异常).运行时异常是一种设计或者是实现问题上出现的错误,大多数是由于程序设计不当而引发的,但这种错误要在运行期间才会发生和被发现.除了运行时异常,其他的异常均为检查型异常.这类异常仍然是发生在运行时,不过编译器在编译时会进行检查,一旦发现某类中的某些语句有可能会产生异常,就提示并强迫开发者立即处理,否则不能编译通过.

 

6.Java的垃圾回收并不能保证内存的耗尽;垃圾回收只是一个低优先级的后台线程,而且跟踪可达或者不可达对象.

当JVM处于空闲循环时,垃圾收集器线程会自动检查每一块分配出去的内存空间,然后自动回收每一块可以回收的无用的内存块.垃圾收集器线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行.

 

7.垃圾收集器的主要特点:

(1)垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃.

(2)垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能被程序中任何"活动的部分"所引用,此时该对象的内存空间已经无用."活动的部分"是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕.

(3)垃圾收集器线程虽然作为低优先级的线程运行,但在系统可用内存量过低的时候,它可能会突发地执行来挽救系统内存资源.

(4)垃圾收集器不可以被强制执行,但程序员可以通过调用System.gc方法来建议执行垃圾收集器.

(5)不能保证一个无用的对象一定会被垃圾收集器收集,也不能保证垃圾收集器在一段Java语言代码中会一定执行.因此在程序执行过程中分配出去的内存空间可能会一直保留到该程序执行完毕,除非该空间被重新分配或者被其他方法回收.由此可见,完全彻底地根绝内存渗漏体的产生也是不可能的.

(6)没有办法预知在一组均符合垃圾收集器收集标准的对象中,哪一个会被首先收集.

(7)循环引用对象不会影响其被垃圾收集器收集.

(8)可以通过将对象的引用变量(reference variable,即句柄handles)初始化为null值,来暗示垃圾收集器来收集该对象.但此时,如果该对象连接有事件监听器,那它还是不可以被收集.所以在设一个引用变量为null值之前,应注意该引用变量指向的对象是否被监听,若有,则要首先出去监听器,然后才可以赋空值.

(9)没一个对象都有一个finalize()方法,这个方法是从Object类继承来的.

(10)finalize()方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器.该方法的调用顺序和用来调用该方法对象的创建顺序是无关的.这就是说,编写程序时该方法的顺序和方法的实际调用顺序是不相干的.请注意这只是finalize()方法的特点.

(11)每个对象只能调用finalize()方法一次.如果在finalize()方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集.

(12)垃圾收集器跟踪每一个对象,收集那些不可到达的对象,回收其占有的内存空间.但在进行垃圾收集的时候,垃圾收集器会调用finalize()方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象.既然每个对象只能调用一次finalize()方法,所以每个对象也只能"复苏"一次.

(13)finalize()方法可以被明确地调用,但它却不能进行垃圾收集.

(14)finalize()方法可以被重载(overload).但只有具备初始finalize()方法特点的方法才可以被垃圾收集器调用.

(15)子类的finalize()方法可以明确地调用父类的finalize()方法,作为该子类对象的最后一次适当的操作.但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查.

(16)当finalize()方法尚未被调用时,System.runFinalization()方法可以用来调用finalize()方法,并实现相同的效果,对无用对象进行垃圾收集.

(17)当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当做垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建.

(18)Java语言使用了一种"标记交换区的垃圾收集算法".该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象.

(19)Java语言允许程序员为任何方法添加finalize()方法,该方法会在垃圾收集器交换回收对象之前被调用.但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的.

(20)Java的垃圾回收机制是为所有Java应用进程服务的,而不是为某个特定的进程服务的.因此,任何一个进程都没有权利去命令垃圾回收机制做什么,怎么做或做多少.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值