JAVA对象在JVM中内存分配
生活随笔
收集整理的這篇文章主要介紹了
JAVA对象在JVM中内存分配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果你還不了解JVM內存模型的建議您先看下JVM內存模型
以一下代碼為例,來分析下,java對象在內存中的空間分配。
public class Student {private String name;private static Birthday birthday = new Birthday();public Student(String name) {this.name = name;}public static void main(String[] args) {Student s = new Student("zhangsan");int age = 10;System.out.println(age);} }class Birthday {private int year = 2010;private int month = 10;private int day = 1; }以Student對象執行到main方法的最后一行時來分析java對象在內存中的分配情況。
如下圖:
圖畫的稍微有點問題,不過能說明對象在內存中的大致位置。
從圖中我們可以看出,普通的java對象內存分配,主要在這三個區域:虛擬機棧、堆、方法區。
從內存區域來分析
- 棧只存放局部變量
- 堆中存儲對象的實例
- 法區中存放Class信息和常量信息。
從變量的角度來分析
- 局部變量存放在虛擬機棧中(具體應為[棧->棧幀->局部變量表])
- 基本類型的值直接存在棧中。如age=10
- 如果是對象,則只存儲對象的引用。如s=ref
- 實例變量存放在堆中的對象實例中。如Student的實例變量 name=ref
- 靜態變量存放在方法區中的常量池中。如Student.class中的birthday=ref。
- 如果常量的類型是對象則只存儲對象的引用地址
通過變量的角度來分析,我們就可以了解為什么靜態變量不用new就能調用,而實例變量必須new出對象,才能調用。
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8
????點擊這里快速進入簡書
總結
以上是生活随笔為你收集整理的JAVA对象在JVM中内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻塞队列和ArrayBlockingQu
- 下一篇: ConcurrentHashMap 原理