1.线程
这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,会释放原生线程和 Java 线程的所有资源。
2.JVM 内存区域
- 线程私有
- 程序计数器:指向虚拟机字节码指令的位置,唯一一个无OOM的区域
- 虚拟机栈
- 虚拟机栈与线程的生命周期相同
- 一个线程中,每调用一个方法创建一个栈帧(Stack Frame)
- 栈帧结构:本地变量 操作数栈 对运行时常量池的引用
- 异常:
- 线程请求的栈深度大于JVM所允许的深度,会出现:StackOverflowEiior
- 若JVM允许动态扩展,若无法申请到足够内存,则出现:OutOfMemoryError
- 本地方法栈
- 线程共享
- Java 堆:类的实例
- 新生代
- eden
- from survivor
- to survivor
- 老年代
- 异常 :OutOfMemoryError
- 方法区
- 直接内存:不受JVM GC 管理
线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。
线程共享区域随虚拟机的启动/关闭而创建/销毁。
直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用DirectByteBuffer 对象作为这块内存的引用进行操作(详见: Java I/O 扩展), 这样就避免了在 Java堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。
本文摘自 :https://blog.51cto.com/l