Excption与Error包结构

  1. 运行时异常(RuntimeException):
  • 包括RuntimeException及其子类。
  • 编译器不强制处理,可以不捕获也不抛出。
  • 常见类型包括ArithmeticException、IndexOutOfBoundsException、NullPointerException等。
  1. 被检查异常(CheckedException):
  • 是Exception的子类,但不包括RuntimeException。
  • 编译器强制处理,必须捕获或声明抛出。
  • 常见类型包括IOException、FileNotFoundException、SQLException等。
  1. 错误(Error):
  • 包括Error类及其子类。
  • 编译器不检查,通常由JVM抛出,表示严重错误。
  • 常见类型包括VirtualMachineError、OutOfMemoryError等。

OOM 知识点

  1. Java Heap 溢出:
  • 异常信息:java.lang.OutOfMemoryError: Java heap space。
  • 原因:不断创建对象且避免垃圾回收,直到堆内存耗尽。
  • 诊断:使用内存分析工具(如Eclipse Memory Analyzer)分析堆转储快照,区分内存泄漏还是内存溢出。
  • 解决方案:检查并优化内存使用,调整JVM参数(如-Xmx和-Xms)。
  1. 虚拟机栈和本地方法栈溢出:
  • 异常:StackOverflowError(请求的栈深度超过最大深度)或OutOfMemoryError(扩展栈时内存不足)。
  • 注意:栈大小增加会减少可分配线程数。
  1. 运行时常量池溢出:
  • 异常信息:java.lang.OutOfMemoryError: PermGen space。
  • 原因:常量池内容过多,如通过String.intern()添加字符串。
  • 解决方案:限制方法区大小(通过-XX:PermSize和-XX:MaxPermSize)。
  1. 方法区溢出:
  • 异常信息:java.lang.OutOfMemoryError: PermGen space。
  • 原因:类信息占用内存过多,或类对象未及时回收。
  • 注意:在动态生成大量Class的应用中,需特别注意。

SOF 知识点

  1. 定义:
  • StackOverflowError是在应用程序递归调用太深,导致堆栈空间耗尽时抛出的错误。
  1. 常见原因:
  • 深度递归调用:递归调用层次过深,超出栈的容量限制。
  • 大量循环或死循环:在循环中不断压栈,可能导致栈空间耗尽。
  • 全局变量过多:虽然不直接导致栈溢出,但可能间接增加栈的使用。
  • 数据结构过大:如数组、List、Map等数据结构过大,可能导致栈溢出。
  1. 处理建议:
  • 优化递归算法,减少递归深度或改用迭代方法。
  • 检查并修复可能导致无限循环的逻辑错误。
  • 减少不必要的全局变量使用。
  • 优化数据结构的大小,避免过大的数据结构导致栈溢出。

线程程序进程知识点

  1. 程序:
  • 定义:含有指令和数据的文件,存储在磁盘或其他存储设备中。
  • 特性:静态的代码,未被执行。
  1. 进程:
  • 定义:程序的一次执行过程,是系统运行程序的基本单位。
  • 特性:动态的,包括创建、运行到消亡的过程。
  • 资源:占有CPU时间、内存空间、文件、输入输出设备的使用权等。
  1. 线程:
  • 定义:进程划分的更小的运行单位。
  • 特性:比进程更小的执行单位,共享进程的内存空间和系统资源。
  • 区别:线程之间可能相互影响,而进程之间基本上是独立的。
  1. 关系:
  • 程序是静态的代码,进程是程序的动态执行实例。
  • 一个进程可以包含多个线程,线程是进程中的一个实体。
  • 线程是轻量级的,创建和切换的开销小于进程。
  • 进程提供了操作系统级别的并发执行,而线程提供了同一程序内的并发执行。

有些字段不想序列化,怎么办?

  1. 使用transient关键字:
  • 作用:阻止被修饰的变量被序列化。
  1. transient关键字的限制:
  • 只能修饰变量,不能修饰类或方法。
  1. 序列化和反序列化的影响:
  • 序列化时:被transient修饰的变量不会被持久化。
  • 反序列化时:被transient修饰的变量值不会被恢复,通常会保持默认值。

说说 IO 流

  1. 按流向分:
  • 输入流:用于读取数据。
  • 输出流:用于写入数据。
  1. 按操作单元分:
  • 字节流:以字节为单位进行数据操作。
  • 字符流:以字符为单位进行数据操作。
  1. 按角色分:
  • 节点流(低级流):直接从数据源或目的地读写数据,如FileInputStream、FileOutputStream。
  • 处理流(高级流):基于其他流,提供额外的功能,如缓冲、转换等,如BufferedReader、BufferedWriter。
  1. 基类:
  • InputStream:所有字节输入流的基类。
  • OutputStream:所有字节输出流的基类。
  • Reader:所有字符输入流的基类。
  • Writer:所有字符输出流的基类。

Java IO与 NIO的区别

  1. 引入时间:
  • NIO是在JDK 1.4中引入的。
  1. 作用与目的:
  • NIO与IO具有相同的作用和目的,即进行输入输出操作。
  1. 实现方式:
  • NIO与IO的实现方式不同,NIO主要使用块(block)操作。
  1. 效率:
  • 由于使用块操作,NIO的效率通常高于IO。
  1. API分类:
  • Java API中提供了两套NIO:
    • 一套针对标准输入输出的NIO。
    • 另一套用于网络编程的NIO。
11-02 02:35