JVM调优(一)虚拟机的内存模型

本文详细介绍了Java虚拟机(JVM)内存模型中的关键组件,包括程序计数器、Java虚拟机栈、本地方法栈等。重点阐述了这些内存区域的作用、它们如何影响Java程序的执行以及可能出现的错误情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Java虚拟机内存模型是Java程序运行的基础,JVM虚拟机的内存模型如下图:

程序计数器

程序计数器(Program Counter Register)是一块很小的内存空间。由于java是支持多线程的语言,当线程数超过cpu的数量时,线程之间根据时间片轮询抢夺cpu资源。对于单核cpu而言,每一时刻只能有一个线程运行,而其他线程必须被切换出去。为此每一个线程必须用一个独立的程序计数器,用于记录下一条要运行的指令。各个线程的程序计数器,互不影响,独立工作,是一块程序私有的内存空间。

如果当前线程正在执行一个java方法,则程序计数器记录正在执行的java字节码地址,如果当前线程正在执行一个native方法,则程序计数器为空。

java虚拟机栈

java虚拟机栈也是线程私有的内存空间,它和线程在同一时间创建,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

java虚拟机规范允许java栈的大小是动态的或者固定的,如果线程在计算的过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果java栈可以动态扩展,在扩展的过程中,没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError。

在Hot Spot虚拟机中,可以使用-Xss参数来设置栈的大小。栈的大小直接决定了函数调用的可达深度。

以下代码是一个递归调用,计数器记录了递归的层次,这个没有出口的递归程序一定会导致栈溢出。程序在栈溢出时,打印出栈的当前深度,




本地方法栈


java堆


方法区

与堆空间类似,它也是被jvm中所有线程共享的。方法区主要保存的是类的元数据。


对常量池的回收:只要常量池中的常量没有被任何地方引用,就可以被回收。

对类元数据的回收:如果虚拟机确认该类的所有实例已经被回收,并且加载该类的classloader已经被回收,gc就有可能回收该类型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值