JVM内存区域

前言

java并发是基于JMM支撑的,为了更好的理解并发的相关知识,我又从头整理了下JVM的相关知识,所以在分析的过程中我想结合线程的角度。

运行时数据区

Java虚拟机运行时数据区(图片来自网络):

  1. 方法区:线程共享,执行java源代码时,首先将java编译成class文件加载到Java虚拟机中,类的元数据会被存放于方法区,类的Class对象存放在堆中,实际运行时,线程执行方法区中的代码,生成的对象存放在堆中。在JDK1.8方法区改为了元空间。
  2. 堆:线程共享,(1)存放class文件从静态文件加载到内存中生成的Class对象(2)在线程执行的过程中生成的对象,线程将引用存放在局部变量表(属于栈桢)里 (3)常量池(JDK1.6时在方法区,1.7在堆中)
  3. 虚拟机栈:线程私有,栈帧组合成的栈结构,是执行java方法的内存模型,线程在调用一个方法时就会生成一个栈桢,栈桢中可以存放局部变量包、操作数栈、动态链接、方法出口等信息。正因为虚拟机栈是线程私有的,所以局部变量不会出现并发的相关问题。
  4. 程序计数器:线程私有,和操作系统的进程类似,用于记录当前线程执行的行号指示器。
  5. 本地方法栈:线程私有,用于执行native方法。
  6. 直接内存:这个在图中没有,jdk后来引入了NIO,NIO是一种基于Channel和Buffer的I/O方式,可以使用Native函数库直接分配堆外内存,然后在堆中留一个引用进行操作

因此,java代码执行流程就可以概括为:执行java代码首先要将他编译成class文件加载到Java虚拟机中,加载后的Java类会被存放于方法区,实际运行时,虚拟机会执行方法区内的代码。java虚拟机在内存中分出堆和栈来存储运行时的数据,并且将栈细分为面向java方法的Java方法栈,和面向本地方法的本地方法栈,以及存放线程执行位置的PC寄存器, 调用java方法,虚拟机会在当前线程的Java方法栈中生成一个栈帧存放局部变量和字节码的操作数等。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值