java的内存区域
- 程序计数器:当前线程所执行的字节码的行号指示器,用于线程切换后能恢复到正确的执行位置
- java虚拟机栈:其中局部变量表存放编译期可知的基本类型、对象引用
- 本地方法栈:虚拟机使用到的本地方法服务
- java堆:内存区域最大的一块,gc主要区域,用来存放实例
- 方法区:存储被虚拟机加载过的类的信息、常量、静态变量、即使编译后的代码
- 直接内存:nio相关
java对象的创建过程
类加载检测-->内存分配-->初始化零值-->设置对象头-->执行init
- 类加载检测:常量池中定位此类的符号引用,并检查是否被加载、解析、初始化过,如果没有则先加载
- 分配内存:两种方式:指针碰撞、空闲列表
- 初始化零值:分配内存后可直接使用
- 设置对象头:存储类的元数据信息,对象的hashCode、分代年龄
- 执行init:按照程序的医院初始化
对象访问的两种方式
句柄、直接指针
java对象的生命周期
- 创建阶段
- 应用阶段
- 不可见阶段
- 不可达阶段
- 收集阶段
- 终结阶段
- 对象空间重分配阶段
堆内存设置的参数
-Xmx:设置堆的最大空间大小
-Xms:设置堆的最小空间大小
类加载器
负责读取java字节码,并转换成Java.lang.Class的实例
类加载器种类
- 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/lib
- 扩展类加载器(Extension ClassLoader)
- 系统(应用)类加载器(Application Classloader)
- 自定义类加载器
关系:应用类加载器继承自扩展类加载器、自定义类加载器继承自应用类加载器
双亲委派机制
类加载器收到类加载请求,自己不加载,向上委托给父类加载,父类加载不了再自己加载
优势:不会多次加载同一个类、每个类加载器只加载自己范围内的类
自定义类加载器的意义
加载特定路径的.class文件
加载网络上加密的.class文件
热部署加载class文件
多线程
- 并发(Concurrent):通过cpu调度算法,使看起来同时执行,cpu层面不是真正的同时
- 并行(Parallel):多个cpu实例或多台机器同时执行一段处理逻辑
- 线程安全:经常描述一段代码。指在并发情况下,改代码经过多线程使用,线程的调度顺序不影响任何结果
- 同步:Java中同步指通过人为的控制和调度,使多线程之间的共享资源变为线程安全的,来保证准确性
- 线程的状态:
多线程实现
如何在java中实现多线程?
- 继承Thread类,重写run方法
- 实现Runable接口,重写run方法
用runable还是Thread?
- 当类本身已经继承其他类时,实现Runable接口,因为不支持多重继承
Runable和Callable有什么不同?
- Callable的call方法可以有返回值和抛出异常,可以返回有计算结果的Future对象
线程池
避免了在处理短时间任务时创建与销毁线程的代价
- 线程池管理器(ThreadPoolManager):用于创建并管理线程
- 工作线程(WorkThread):线程池中的线程
- 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行
- 任务队列:用于存放没有处理的任务,提供一种缓冲机制