淺談JVM與內存分配

一.程序內存分配java

初始內存分配數組

當一個程序準備運行時,它首先向java虛擬機要內存,可是java虛擬機自己沒有權限,它只能向操做系統申請內存,此時java虛擬機會擁有一個初始內存,eclipse

此處額外說明一下eclipse.ini文件中的幾個參數:jvm

-vmargs -Xms256m -Xmx512m -XX:PermSize=256M -XX:MaxPermSize=512M
-vmargs 說明後面是VM的參數,因此後面的其實都是JVM的參數了
-Xms256m JVM初始分配的堆內存
-Xmx512m JVM最大容許分配的堆內存,按需分配
-XX:PermSize=256M JVM初始分配的非堆內存
-XX:MaxPermSize=512M JVM最大容許分配的非堆內存,按需分配
this

而後,java虛擬機在爲程序開內存;當程序須要更多的空間時,假如把初始內存都佔用了,怎麼辦?固然啦,它會繼續向操做系統申請啊,以下圖:
spa

 

那麼問題來啦,它不可能一直申請啊?對不對,總有用完的時候,當超過堆內存的最大值時候,就不會再分配了,會通知內存溢出!操作系統

二.誰在佔用內存?code

我相信這個圖已經可以說明了,在jvm中有七塊內存區域,如今咱們只討論其中的三塊,棧塊、堆塊、方法區:對象

棧快中存儲:對象的引用,基本數據類型;blog

堆塊中存儲:具體對象;

方法區中:完整的類結構。

三.舉個實例進行分析:

person類

public class Person {
    public String name = null;
    public int age = -1;
    
    public Person() {
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void showMe() {
        System.out.println(name + "/" + age);
    }
}

main方法

public class PersonRun {

    public static void main(String[] args) {
        Person pj = null;
        pj = new Person("普京", 45);
        pj.showMe();
        
        Person obm = null;
        obm = new Person("奧巴馬", 50);
        obm.showMe();
        
        int num = 10;
        System.out.println(num);
        
        int[] n = new int[]{1, 2, 3};
    }

}

內存分配圖:

說明:

當咱們編寫一個person類時,當程序在運行時,類結構會被分配到方法區中,它只會有一份;

當咱們Person pj = null;它被放在棧的區域,new Person("普京", 45);它放在了堆裏,好比地址是1000d,它不會爲方法再開空間,而是當咱們用時會到方法中去找;

而後咱們用一個引用去指向它,這樣方便使用,好比pj在棧中的地址:100z,pj存儲的是1000d地址,當咱們調用showMe()方法時,先找到100z,在找到1000d,在找到方法區中的方法。

基本數據類型如  int num = 10;程序要使用它時,直接從棧中取;對於數組類型n,它存在引用跟pj相似。

相關文章
相關標籤/搜索