一.程序內存分配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相似。