首页   快速返回

Java运行时数据区     所属分类 java
java程序运行时分为5种内存区域。
方法区,堆,线程栈,本地方法区,程序计数器。

共享:堆,方法区。
私有:本地方法区,程序计数器,线程栈。



方法区:虚拟机加载的类的信息,静态变量,常量。
Java堆:对象实例和数组,可以分为新生代(young)和年老代(tenured)。新生代有分为eden,from survivor和to survivor。

线程栈:随线程一起建立,是方法执行的内存模型。当方法开始执行时,载入局部变量(引用变量),参数,返回值。
      栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数 设置虚拟机栈大小)。
      栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;
      如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。
程序计数器:java被编译成class,JVM解释执行,执行的是每一条指令。程序计数器记录当前线程执行的字节码地址,使得程序在轮询获取CPU时间片执行的时候能够知道从何处执行。
本地方法栈: 本地方法的内存模型,管理本地方法的执行 Native

虚拟机线程栈组成

虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧(Stack Frame)
用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用 reference 类型,它不等同于对象本身。

栈区:  
1.每个线程包含一个栈区,栈中只保存基础数据类型本身和对象的引用
2.每个栈中的数据(原始类型和对象引用)都是私有的 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

JVM的进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,
每当线程调用一个方法的时候就会向方法栈压入一个新帧。帧用来存储方法的参数、局部变量和运算过程中的临时数据。

上一篇     下一篇
语音合成TTS简介

JAVA架构师面试题

Java线程状态中BLOCKED和WAITING的区别

面试技巧之STAR法则

flink快速入门

flink web控制台介绍