Java运行时数据区域

Wesley13
• 阅读 606

两个名词的对比

  • java内存模型

定义了线程和主内存之间的抽象关系,即Jvm在计算机内存中的工作方式,控制线程之间的通信。

  • java内存区域

内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。

今天主要总结一下Java运行时的数据区域

Java运行时数据区域

Java运行时数据区域主要可以分为五个区域: 1.程序计数器 2.Java虚拟机栈 3.本地方法栈 4.堆 5.方法区

程序计数器

  • 作用

用来记录线程正在执行的虚拟机字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)。

  • 共享性

每一个线程都有自己独立的程序计数器,各条线程之间计数器互不影响。

  • 大小

是一块较小的内存空间,而且此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

Java虚拟机栈

  • 作用

一个方法在执行的同时,会创建一个栈帧用于存储该方法的**局部变量、方法出口、操作数栈、动态链接等信息。**方法从执行到结束,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

  • 共享性

线程私有的,它的生命周期与线程相同。

本地方法栈

  • 作用

和Java虚拟机栈作用相似,区别在于Java虚拟机栈执行的式java方法,而本地方法栈执行的是虚拟机使用到的Native方法

Java堆

  • 作用

就是存放对象实例,几乎所有的对象实例都在这里分配内存

  • 大小

是 Java 虚拟机所管理的内存中最大的一块

  • 共享性

被所有线程共享的一块内存区域

方法区

  • 作用

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

  • 共享性

与 Java 堆一样,是各个线程共享的内存区域

问题

1. 从堆和栈的功能以及作用来比较,堆和栈有什么不同?

堆主要用来存放对象,栈主要是用来执行程序的。相较于堆,栈的存取速度更快,但栈的大小和生存周期必须确定,因此缺乏一定的灵活性。而堆却可以在运行时动态的分配内存,生存期不用提前告诉编译器,但这也导致了其存取速度的缓慢。

2. 不同线程调用方法为什么是线程安全的?

任何方法每次被线程调用,都会在栈中开辟新的空间。同一方法的不同线程执行,方法与方法之间互不影响。全局变量因为是存在堆区的对象中,所以会互相干扰。 3. 成员变量存储在哪儿?

静态成员变量存储在方法区,非静态成员变量存储在堆区。 4. 为什么局部变量不能够static修饰?

局部变量存储在栈区,在方法调用时不能够自动初始化必须由程序员手动初始化,否则会报错,归根结底是由于static变量和局部变量存储的位置不一样。

下一节介绍Java内存模型。 参考: Java内存区域划分 Java内存区域(运行时数据区域)和内存模型(JMM)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
红烧土豆泥 红烧土豆泥
3年前
(转载)Java内存区域(运行时数据区域)和内存模型(JMM) - czwbig
转载自:Java内存区域和内存模型是不一样的东西,内存区域是指Jvm运行时将数据分区域存储,强调对内存空间的划分。而内存模型(JavaMemoryModel,简称JMM)是定义了线程和主内存之间的抽象关系,即JMM定义了JVM在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java
九路 九路
4年前
3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局一Java对象的内存布局在HotSpot虚拟机中,对象在内存中的布局分为3个区域对象头(Header)MarkWord(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储对象自身的运行时数据,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等类型指
Stella981 Stella981
3年前
JVM内存区域划分
JVM内存区域划分一、JVM运行时数据区划分根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,如下图所示:方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。!(https
Stella981 Stella981
3年前
JVM运行时数据区
Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,及创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图(图片引自网络):!(https://static.oschina.net/uplo
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
JVM 运行时内存分配
Java内存分配在解释这个问题之前,我想简单的记录一下Java虚拟机对内存的分配管理。!(https://static.oschina.net/uploads/space/2017/0207/160723_gnLQ_1054538.jpg)简单的说,Java运行时内存区域,就由上面几部分构成。青绿色标记的,是每个线程私有的内存区域,其
Stella981 Stella981
3年前
JVM 面试
1、内存模型以及分区,需要详细到每个区放什么。通俗的说,Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在Java虚拟机启动时创建,非堆内存(NonheapMemory)是在JVM堆之外的内存。简单来说,堆是Java代码可及的内
Stella981 Stella981
3年前
JVM类加载
运行时数据区java虚拟机定义了若干种程序运行时使用到的运行时数据区1.有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁2.第二种则是与线程一一对应,随线程的开始和结束而创建和销毁。java虚拟机所管理的内存将会包括以下几个运行时数据区域!(http://static.oschina.net/uplo