挑战第 4 天
- Excption与Error包结构
- OOM 知识点
- SOF 知识点
- 线程程序进程知识点
- 有些字段不想序列化,怎么办?
- 说说 IO 流
- Java IO与 NIO的区别
Excption与Error包结构
- 运行时异常(RuntimeException):
- 包括RuntimeException及其子类。
- 编译器不强制处理,可以不捕获也不抛出。
- 常见类型包括ArithmeticException、IndexOutOfBoundsException、NullPointerException等。
- 被检查异常(CheckedException):
- 是Exception的子类,但不包括RuntimeException。
- 编译器强制处理,必须捕获或声明抛出。
- 常见类型包括IOException、FileNotFoundException、SQLException等。
- 错误(Error):
- 包括Error类及其子类。
- 编译器不检查,通常由JVM抛出,表示严重错误。
- 常见类型包括VirtualMachineError、OutOfMemoryError等。
OOM 知识点
- Java Heap 溢出:
- 异常信息:java.lang.OutOfMemoryError: Java heap space。
- 原因:不断创建对象且避免垃圾回收,直到堆内存耗尽。
- 诊断:使用内存分析工具(如Eclipse Memory Analyzer)分析堆转储快照,区分内存泄漏还是内存溢出。
- 解决方案:检查并优化内存使用,调整JVM参数(如-Xmx和-Xms)。
- 虚拟机栈和本地方法栈溢出:
- 异常:StackOverflowError(请求的栈深度超过最大深度)或OutOfMemoryError(扩展栈时内存不足)。
- 注意:栈大小增加会减少可分配线程数。
- 运行时常量池溢出:
- 异常信息:java.lang.OutOfMemoryError: PermGen space。
- 原因:常量池内容过多,如通过String.intern()添加字符串。
- 解决方案:限制方法区大小(通过-XX:PermSize和-XX:MaxPermSize)。
- 方法区溢出:
- 异常信息:java.lang.OutOfMemoryError: PermGen space。
- 原因:类信息占用内存过多,或类对象未及时回收。
- 注意:在动态生成大量Class的应用中,需特别注意。
SOF 知识点
- 定义:
- StackOverflowError是在应用程序递归调用太深,导致堆栈空间耗尽时抛出的错误。
- 常见原因:
- 深度递归调用:递归调用层次过深,超出栈的容量限制。
- 大量循环或死循环:在循环中不断压栈,可能导致栈空间耗尽。
- 全局变量过多:虽然不直接导致栈溢出,但可能间接增加栈的使用。
- 数据结构过大:如数组、List、Map等数据结构过大,可能导致栈溢出。
- 处理建议:
- 优化递归算法,减少递归深度或改用迭代方法。
- 检查并修复可能导致无限循环的逻辑错误。
- 减少不必要的全局变量使用。
- 优化数据结构的大小,避免过大的数据结构导致栈溢出。
线程程序进程知识点
- 程序:
- 定义:含有指令和数据的文件,存储在磁盘或其他存储设备中。
- 特性:静态的代码,未被执行。
- 进程:
- 定义:程序的一次执行过程,是系统运行程序的基本单位。
- 特性:动态的,包括创建、运行到消亡的过程。
- 资源:占有CPU时间、内存空间、文件、输入输出设备的使用权等。
- 线程:
- 定义:进程划分的更小的运行单位。
- 特性:比进程更小的执行单位,共享进程的内存空间和系统资源。
- 区别:线程之间可能相互影响,而进程之间基本上是独立的。
- 关系:
- 程序是静态的代码,进程是程序的动态执行实例。
- 一个进程可以包含多个线程,线程是进程中的一个实体。
- 线程是轻量级的,创建和切换的开销小于进程。
- 进程提供了操作系统级别的并发执行,而线程提供了同一程序内的并发执行。
有些字段不想序列化,怎么办?
- 使用transient关键字:
- 作用:阻止被修饰的变量被序列化。
- transient关键字的限制:
- 只能修饰变量,不能修饰类或方法。
- 序列化和反序列化的影响:
- 序列化时:被transient修饰的变量不会被持久化。
- 反序列化时:被transient修饰的变量值不会被恢复,通常会保持默认值。
说说 IO 流
- 按流向分:
- 输入流:用于读取数据。
- 输出流:用于写入数据。
- 按操作单元分:
- 字节流:以字节为单位进行数据操作。
- 字符流:以字符为单位进行数据操作。
- 按角色分:
- 节点流(低级流):直接从数据源或目的地读写数据,如FileInputStream、FileOutputStream。
- 处理流(高级流):基于其他流,提供额外的功能,如缓冲、转换等,如BufferedReader、BufferedWriter。
- 基类:
- InputStream:所有字节输入流的基类。
- OutputStream:所有字节输出流的基类。
- Reader:所有字符输入流的基类。
- Writer:所有字符输出流的基类。
Java IO与 NIO的区别
- 引入时间:
- NIO是在JDK 1.4中引入的。
- 作用与目的:
- NIO与IO具有相同的作用和目的,即进行输入输出操作。
- 实现方式:
- NIO与IO的实现方式不同,NIO主要使用块(block)操作。
- 效率:
- 由于使用块操作,NIO的效率通常高于IO。
- API分类:
- Java API中提供了两套NIO:
- 一套针对标准输入输出的NIO。
- 另一套用于网络编程的NIO。