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

前言

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就有可能回收该类型。


--------------------- 
作者:代码最诚实的朋友 
来源:CSDN 
原文:https://blog.csdn.net/matt8/article/details/52274039 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/tyjlearning/article/details/83690880
今日推荐