java虚拟机内存模型

Posted 千彧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java虚拟机内存模型相关的知识,希望对你有一定的参考价值。

       java虚拟机内存模型是java程序运行的基础。

       java虚拟机将其内存数据分为程序计数器、虚拟机栈、本地方法栈、java堆和方法区。

      如果根据受访权限的不同我们可以定义上述几个区域分为线程共享和线程私有两大类。线程共享指的是可以允许被所有线程共享访问的一类内存区这类区域包括堆内存区、方法区、运行时常量池三个内存区。

      简单一句话描述用途,程序计数器用于存放下一条运行的指令,虚拟机栈和本地方法栈用于存放函数调用堆栈信息,java堆用于存放java程序运行时所需的对象等数据,方法区用于存放程序的类元数据信息。

    1. 程序计数器

      当线程数量超过CPU数量时,线程之间会自动根据时间片轮询方式抢夺CPU资源。对于单核CPU而言,每一个时刻只能有一个线程处于运行状态,其他线程必须被切换出去,直到轮询轮到自己才能使用CPU资源,为此,每一个线程都必须用一个独立的程序计数器,他被用来记录下一条需要执行的计算机指令。对于多核CPU来说,可以允许多个线程同时进行,各个线程之间的计数器互不影响,独立工作,所以程序计数器是线程独有的一块内存空间。为了让线程切换后能恢复到正确的执行位置,每条线程要有一个独立的程序计数器。

     2.虚拟机栈

       该区域位于通用RAM里,通过所谓的“栈指针”可以让我们访问处理器,存取速度仅次于寄存器。

      虚拟机栈代码示例:

 1 import java.util.concurrent.CountDownLatch;
 2 public class TestJVMStack {
 3 private int count  = 0;
 4 public void recursion() {
 5     count ++ ; //栈深度加 1
 6 
 7     recursion();//递归消耗栈内存分配
 8 }
 9     public void testStack() {
10         
11         try {
12             recursion();
13         } catch (java.lang.StackOverflowError e) {
14             System.out.println("打印出栈溢出的深度:"  + count);            
15             e.printStackTrace();
16         }    
17     }
18     public static void main(String[] args) {
19         TestJVMStack   ts  = new TestJVMStack();
20         ts.testStack();
21     }
22 }

运行结果:

1 打印出栈溢出的深度:18664
2 java.lang.StackOverflowError
3     at TestJVMStack.recursion(TestJVMStack.java:8)
4     at TestJVMStack.recursion(TestJVMStack.java:8)
5     at TestJVMStack.recursion(TestJVMStack.java:8)
6     at TestJVMStack.recursion(TestJVMStack.java:8)

      3.本地方法栈

 

以上是关于java虚拟机内存模型的主要内容,如果未能解决你的问题,请参考以下文章

Java内存模型

java虚拟机之内存模型

图解Java虚拟机内存模型

图解Java虚拟机内存模型

浅谈JVM内存结构,Java内存模型和Java对象模型

小白都能看得懂的java虚拟机内存模型