最新java虚拟机JVM详解

一、什么是虚拟机?

虚拟机分为系统虚拟机(如VMware、VirtualBox)和程序虚拟机(如java虚拟机)。

二、JVM的种类

常见的有HotSpot和JRockit

三、JVM的基本结构

9个区域:类加载子系统、方法区、java堆、直接内存、java栈、本地方法栈、GC、PC寄存器、执行引擎

方法区:(解决堆栈信息的产生,模版信息)存放类信息(即class对象模版/类的字段、方法)、常量、常量池;静态的,所有线程共享

java堆:(解决数据存储问题)存放实例对象,堆空间所有线程共享;JVM启动时建立

java栈:(解决程序运行问题,即处理数据)每个线程有一个私有的栈,栈在线程创建时被创建。保存着(临时变量、引用)局部变量、方法参数、java方法的调用、返回值。(栈有栈深,递归方法容易溢出)
在这里插入图片描述
本地方法栈:java虚拟机允许java直接调用本地方法(通常用C编写)

PC寄存器:每个线程私有,存放当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等。若当前执行的方法不是本地方法,则PC寄存器会执行当前的指令;若为本地方法,则PC寄存器的值为undefined

类加载子系统:从文件系统或网络中加载Class信息到方法区

执行引擎:执行虚拟机的字节码(先编译成机器码,后执行)

直接内存:java的NIO库允许java程序使用直接内存,从而提高性能。通常直接内存速度会优于java堆,读写频繁的场合可能会考虑使用

GC:垃圾收集系统

扫描二维码关注公众号,回复: 11264763 查看本文章

方法区、堆、栈的关系
方法区、堆、栈的关系

四、java堆中的新生代和老年代

新生代分为eden区、s0区、s1区。s0和s1也被称为from和to区域;s0和s1大小相等且可以互换角色
在这里插入图片描述
新生代:老年代一般设置为1:2或1:3

五、GC算法

1、复制算法(新生代)
2、标记压缩法(老年代)
3、分代算法:减少gc停顿(程序停顿)时间,把内存分为很多个(网格)

  • JVM中的7个收集器:(连线表示可搭配使用)

在这里插入图片描述

六、虚拟机参数配置

-XX是系统级别(JVM层次)的配置,如配置日志信息/配置垃圾回收器;非-XX是应用层面上的配置。
+表启用
-表禁用

七、TLAB

Thread Local Allocation Buffer线程本地分配缓存。
如果设置了虚拟机参数 -XX:UseTLAB,则线程初始化时,会申请一块指定大小的内存(即TLAB域),只给当前线程使用。由于每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在(多线程)竞争(一块内存空间)情况,可提升分配效率。
当大对象无法在TLAB区分配时,才会直接分配到堆上。(其实TLAB是在堆的Eden中)

八、JVM优化

  1. 选择JVM版本(执行引擎)client / server
  2. 配置堆区大小
  3. 垃圾收集器的选择

猜你喜欢

转载自blog.csdn.net/sinat_33404263/article/details/104753697