JVM 那些事

April 27, 2024

👀...
#Java
#JVM

JVM 内存模型

image-20231216143745130

堆内存一般被细分为新生代和老年代,更细致的划分为Eden区、From Survivor区和To Survovor区;

方法区主要存储被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据,站在垃圾回收器的角度,它被称为持久代。(1.8之后,持久代被元空间(Meta Space)取代。)

虚拟机栈大小可以通过-xss来配置;程序计数器的内存占用可以忽略不计。

JVM 在默认情况下栈内存的大小(一个线程占的固定内存):

java -XX:+PrintFlagsFinal -version|grep ThreadStackSize

一般该值越小操作系统能够创建的线程就越多。

守护线程

这个知识点确实是第一次看到。

The Java Virtual Machine exit when the only threads running are all daemon threads.

在main线程中创建一个不会停止的子线程,那么JVM进程并不会停止;如果通过 thread.setDaemon(true)设置该子线程为守护进程,那么main结束了,JVM 就会退出,因为当所有运行的线程只剩守护进程时,JVM会退出,这是JVM所规范的。

线程的 Sleep 和 Yield

  1. Sleep 让线程去等待,进入 Block(time_waiting)的状态,不再有CPU时间片的消耗?怎么做到的呢?

操作系统通过调度器来管理线程的执行。当一个线程调用 sleep 方法时,操作系统会将该线程从可执行状态转换为阻塞状态,并将其从 CPU 的执行队列中移除。在指定的时间段内,该线程不会参与 CPU 的调度,从而实现了暂停执行的效果。

操作系统会使用定时器来跟踪线程的休眠时间。一旦休眠时间结束,操作系统会将线程重新放入可执行状态,使其可以再次参与 CPU 的调度。

总的来说,操作系统通过调度器和定时器来管理线程的休眠,从而实现了 sleep 方法的功能。

  1. yield 和 sleep 的区别?

Yield 是线程提醒CPU,如果CPU太忙的话就先不用执行它,让 Running 状态的 Thread 进入 Runnable 状态,CPU 是可以忽略这个提示的。

  1. Sleep 可以用 TimeUnit 替代。
Comments