java虚拟机JVM及其垃圾回收机制GC

一、什么是虚拟机?

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

二、JVM的种类

常见的有 HotSpot 和 JRockit

三、JVM的基本结构

5大区域
线程共享:方法区、堆
线程私有:Java栈、本地方法栈、程序寄存器

方法区:「生产堆栈信息的模版信息」存放类信息、常量、静态变量(这里指jdk6的方法区,不同版本的方法区实现不一样)

:「解决数据存储问题」存放对象和数组(说白了就是存放非静态成员变量,即实例变量)

:「解决程序运行问题,即处理数据」栈在线程创建时被创建。每个线程中的每个方法在执行时都会创建一个栈帧用于存放局部变量表、操作数栈、动态链接、方法返回地址等。
(栈有栈深,递归方法容易溢出)

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

本地方法栈:JVM允许java直接调用 (通常用C编写的)本地方法

虚拟机栈(执行java方法) + 本地方法栈(执行native方法)

程序计数器:存放当前执行环境指针、操作栈指针、计算的变量指针等。若当前执行的方法是本地方法,则PC寄存器的值为undefined;若不是,则PC寄存器会执行当前的指令
在这里插入图片描述
*其他相关模块

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

Execution Engine:执行虚拟机字节码(先编译成机器码,后执行)

直接内存:java的 NIO库 (new input/output库) 允许java程序使用直接内存,通过一个存储在堆中的DirectByteBuffer作为这块内存的引用进行操作,能在一些场景中提高性能。(其中有一个address属性指向堆外内存地址)
直接使用堆外内存能少去从直接内存拷贝到堆内存的操作(操作系统级别的修改,效率高)
在这里插入图片描述

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

在这里插入图片描述

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

五、垃圾收集器及其算法

1、复制算法(新生代)
2、标记整理法(老年代)
3、标记清除法
4、分代算法:减少gc停顿(程序停顿)时间,把内存分为多块
在这里插入图片描述

  • JVM中的7个收集器:(连线表示可搭配使用,完整版)
    在这里插入图片描述

六、虚拟机参数配置

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

七、TLAB

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

八、JVM优化

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

书:《JVM虚拟机规范》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值