OOM和SOF
OutOfMemory
:
- 堆:对象实例存储过多,
GC Roots
可达路径都有,所以不被垃圾回收机制清除,此时我们需要分析某些对象是否必要,内存泄露,即分配的对象来不及回收,导致有很多无用的引用 - 方法区:类的相关信息,例常量池、类名、方法的描述、字段描述等
StackOverFlow
:
- 栈:无限递归、死循环
线程、程序和进程
线程:比进程小的执行单位,一个进程可以有多个线程,线程直接互相影响,进程各自独立,进程执行程序,线程执行程序段,即程序被拆分成多个程序段
程序:静态的代码,有指令和数据的文件
进程:系统运行程序的基本单位,一个进程就是一个执行的程序,占用电脑内存、CPU、输入输出设备
防止某个字段序列化
transient
关键字,只修饰变量,不能用于方法或类
IO
划分:
-
输入流和输出流
-
字节流和字符流
-
节点流和处理流
注意:处理流的构造方法总是带一个其他流对象做参数,IO中所有类都是由四个抽象类基类派生出来的
Reader
:字符输入流Writer
:字符输出流InputStream
:字节输入流OutputStream
:字节输出流
IO和NIO
NIO:new IO
,效率比IO高,Java API有两套NIO,一套标准输入输出流,一套网络编程;Java NIO
的选择器允许一个单独的线程来监视多个输入通道
IO | NIO |
---|---|
面向流 | 面向缓冲 |
阻塞IO | 非阻塞IO |
无 | 选择器 |
反射
只要知道类的名字,就可以知道类的所有信息,例方法、属性
例:Class.forName("com.mysql.jdbc.Driver.class")
// 加载MySQL驱动类
实现方式:
Class.forName
(类的路径)- 类名.
class
- 对象名.
getClass()
- 基本类型的包装类.
TYPE
// 类名.class
Class<Student> studentClass = Student.class;
// 对象名.getClass()
Class<? extends Student> aClass = stu.getClass();
// 基本类型的包装类.TYPE
Class<Integer> type = Integer.TYPE;
实现反射的类:大部分在java.lang.reflect
包下
Class
:类和接口的信息Field
:类或接口的属性信息,还有访问权限Constructor
:类构造方法信息,还有访问权限Method
:类或接口中方法的信息
优缺点:
- 优点:动态获取类的实例,有一定的灵活性
- 缺点:
- 性能低,需要解析字节码,解决方案是关闭
JDK
安全检查 - 不安全,破坏封装性,例
private
修饰的方法和属性也可以被反射获取到
- 性能低,需要解析字节码,解决方案是关闭