【JVM】HotspotJVM内存区域解析

本文导读

本文详细的讲述了Java虚拟机运行时数据区的程序计数器、虚拟机栈,本地方法栈,方法区,堆,常量池,以及直接内存(堆外内存),对各个区域的作用,服务对象以及其中可能产生的问题展开讨论~

JVM基础知识

JVM 全称是 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

JVM是一个庞大的知识体系,可以从内存结构,内存分配策略,垃圾回收,性能监控工具,类文件结构,类加载机制,字节码执行引擎,JVM自身优化技术,程序性能调优几个方面去学习。

内存结构是了解JVM核心也是前提,同时 JVM 是一个虚拟化的操作系统,所以除了要虚拟指令之外,最重要的一个事情就是需要虚拟化内存。

JVM内存区域

这里讲解的是JVM内存的各个区域,重点讲解这些区域的作用,服务对象以及其中可能产生的问题。

宏观上JVM处于图片中虚线的位置,本篇重点讲解JVM运行时数据区

定义:Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,该区域内存主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈等。同时按照与线程的关系也可以这么划分区域:线程私有区域:一个线程拥有单独的一份内存区域。线程共享区域:被所有线程共享,且只有一份。这里还有一个直接内存,这个虽然不是运行时数据区的一部分,但是会被频繁使用。你可以理解成没有被虚拟机化的操作系统上的其他内存(比如操作系统上有 8G 内存,被 JVM 虚拟化了 3G,那么还剩余 5G, JVM 是借助一些工具使用这 5G 内存的,这个内存部分称之为直接内存)

程序计数器(Program Counter Register)

程序计数器是一块很小的内存空间,是当前线程执行的字节码的行号指示器,各线程之间独立存储,互不影响。主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。因为 JVM 是虚拟机,内部有完整的指令与执行的一套流程,所以在运行 Java 方法的时候需要使用程序计数器(记录字节码执行的地址或行号),如果是遇到本地方法(native 方法),这个方法不是 JVM 来具体执行,所以程序计数器不需要记录了,这个是因为在操作系统层面也有一个程序计数器,这个会记录本地代码的执行的地址,所以在执行 native 方法时,JVM 中程序计数器的值为空(Undefined)。另外程序计数器也是 JVM 中唯一不会 OOM(OutOfMemory)的内存区域。

虚拟机栈(VM Stack)

虚拟机栈是线程运行 java 方法所需的数据,指令、返回地址。栈的数据结构是先进后出(FILO)的数据结构,虚拟机栈的作用,在 JVM 运行过程中存储当前线程运行方法所需的数据,指令、返回地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值