Java内存模型之线程独占部分

内存简介

在这里插入图片描述

  • 32位处理器:2^32 的可寻址范围
  • 64位处理器:2^64 的可寻址范围

地址空间的划分

  • 内核空间
  • 用户空间

在这里插入图片描述

JVM架构图

在这里插入图片描述

  • Class Loader:依据特定格式,加载class文件到内存
  • Execution Engine:对命令进行解析
  • Native Interface:融合不同开发语言的原生库为Java所用
  • Runtime Data Area:JVM内存空间结构模型

JVM内存模型——JDK8

在这里插入图片描述

  • 线程私有:程序计数器、虚拟机栈、本地方法栈
  • 线程共享:MetaSpace、Java堆

程序计数器(Program Counter Register)

  • 当前线程所执行的字节码行号指示器(逻辑)
  • 改变计数器的值来选取下一条需要执行的字节码指令
  • 和线程是一对一的关系即 “线程私有”
  • 对Java方法计数,如果是Native方法则计数器值为Undefined
  • 不会发生内存泄漏

Java虚拟机栈(Stack)

  • Java方法执行的内存模型

  • 包含多个栈帧
    在这里插入图片描述
    局部变量表和操作数栈

  • 局部变量表:包含方法执行过程中的所有变量

  • 操作数栈:入栈、出栈、复制、交换、产生消费变量
    在这里插入图片描述
    执行add(1,2)

public static int add(int a,int b){
	int c = 0;
	c = a + b;
	return c;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

递归为什么会引发java.lang.StackOverflowError异常

public class Fibonacci {
    //F(0) = 0,F(1) = 1,当n>=2的时候,F(n) = F(n-1) + F(n-2)
    //F(2) = F(1) + F(0) = 1, F(3) = F(2) + F(1) = 1+1 = 2
    //F(0)-F(N) 依次为 0,1,1,2,3,5,8,13,21,34...
    public static int  fibonacci(int n){
        if(n == 0) {return 0;}
        if(n == 1) {return 1;}
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    public static void main(String[] args){
        System.out.println(fibonacci(0));
        System.out.println(fibonacci(1));
        System.out.println(fibonacci(2));
        System.out.println(fibonacci(3));
        System.out.println(fibonacci(9));
        //如果我们获取的深一点,看是否获取的到结果
        System.out.println(fibonacci(1000000));
    }
}

在这里插入图片描述

  • 递归过深,栈帧数超过虚拟栈深度

虚拟机栈过多会引发 java.lang.OutOfMemoryError异常
在这里插入图片描述
Exception in thread “main” java.lang.OutOfMemoryError:
unable to create new native thread
(不要尝试着去运行,小心炸了)

本地方法栈

  • 与虚拟机相似,主要作用于标注了native方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值