zoukankan      html  css  js  c++  java
  • 初探JVM------内存布局(二)

    文章中讲到,通常情况下,在研究JVM内存布局时,研究的是java虚拟机栈

    结合讲到的这一点和之前接触到的栈堆知识,还觉得挺合理的,貌似并没有什么冲突,只是之前学习到的东西不全面而已。

    每一个运行在Java虚拟机里的线程都拥有自己的线程栈,且仅能访问自己的线程栈。

    这一句话也比较容易理解,在前一篇文章中学习过,内存区域分为独享区域和共享区域两类,这里的线程栈属于独享区域。

    在接下来文章中提到的几点里,有一部分再次刷新了我对内存布局的认识。

    • 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。

    • 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。

    • 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。

    • 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。

    • 静态成员变量跟随着类定义一起也存放在堆上。

    • 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个本地变量的私有拷贝。


    之前的所了解到的是,基本数据类型的值保存在栈中,引用数据类型的地址保存在栈中,值保存在堆中。

    但是,在文章中明确地指出,一个对象的成员变量可能随着这个对象自身存放在堆上,不管这个成员变量是原始类型还是引用类型。

    而在文章的末尾,我又发现了这样一句话,因为,这些变量是成员变量,所以它们任然随着该对象存放在堆上,仅有本地变量存放在线程栈上。

    再结合从网上找到的资料可以总结一个结论,成员变量是随对象存储在堆中的,而局部变量是存储在java虚拟机栈中的。

  • 相关阅读:
    [引用]SQLServer占CPU100%
    负能量程序员杂谈(2)- 管理中的情和义
    负能量程序员杂谈(1)-世界上最单纯的职业:程序员
    FLV文件格式官方规范详解
    rtmp官方标准规范详细解析
    万恶的KPI、新兴的OKR及让人纠结的程序员考核
    管理点滴(一)
    选拨管理者的一个必要条件
    团队管理的简单总结:少即是多,体力透支,负能量管理,自我进化团队,沟通
    我的2015计划,目标
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13695964.html
Copyright © 2011-2022 走看看