当前位置:首页 > IT技术 > 其他 > 正文

JVM 核心知识
2022-05-11 10:58:15

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 堆中来回复制数据, 因此在一些场景中可以显著提高性能。

JVM 核心知识_数据













本文摘自 :https://blog.51cto.com/l

开通会员,享受整站包年服务立即开通 >