zoukankan      html  css  js  c++  java
  • Java运行时数据区域

    两个名词的对比

    • 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)

  • 相关阅读:
    微信公众号(服务号) 微信支付 由于支付链接不一致导致无法支付
    eclipse tomcat 网页404的一个小问题
    SpringMVC 拦截器(interceptors)对样式(css),JavaScript(js),图片(images)链接的拦截
    Tomcat 改变localhost主页,映射到应用地址
    LeetCode 6. ZigZag Conversion Question
    LeetCode 107. Binary Tree Level Order Traversal II
    LeetCode 70. Climbing Stairs
    LeetCode 191. Number of 1 Bits Question
    LeetCode 100. Same Tree
    go_切片
  • 原文地址:https://www.cnblogs.com/xxyxt/p/11370293.html
Copyright © 2011-2022 走看看