-
內存簡介
內存是計算機中的一個重要原件,是一種臨時存儲區域,作用是運行程序。我們程序員編寫的程序是存放在硬盤中的,但是在硬盤中的程序它是不會運行的,必須放進內存中才能運行,每個程序運行完畢後會自動清空內存。
-
先看下Java中的數組內存圖
從上圖我們可以看到,在一個硬件中(電腦),包含了系統,系統中包含了內存,我們所有的程序都是運行在系統的內存中,如微信,QQ,JVM虛擬機.
爲了提高運算效率,Java虛擬機就對空間進行了不同區域的劃分,因爲每一片區域都有特定的處理數據方式和內存管理方式。
-
JVM的內存劃分:
區域名稱 | 功能 |
寄存器 | CPU在運算,用於保存線程下一個要執行的命令 |
本地方法棧 | JVM在使用操作系統的時候使用 |
方法區 | 存儲編譯後的class文件 |
堆內存 | 存儲對象或者數組,只要是new出來的,全部都存儲在堆內存 |
方法棧 | 方法運行時的內存,比如main方法運行,進入方法棧中執行 |
我們作爲Java攻城獅,需要重點關注的只有三個地方,方法棧,方法區,和堆內存,這三個內容需要我們重點關注!!!
一個數組在內存中的內存圖分析以上方法執行,輸出的結果是[I@38cccef,這個是什麼呢?是數組在內存中的地址。new出來的內容,都是在堆內存中存儲的,而方法中的變量arr保存的是數組的地址。
輸出arr[0],就會輸出arr保存的內存地址中數組中0索引上的元素
public class Demo01 {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr); // [I@50cbc42f
arr[1] = 2;
System.out.println(arr[1]);
}
}
package com.mobaijun;
public class Demo2 {
public static void main(String[] args) {
int[] arr1 = new int[2];
int[] arr2 = new int[3];
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
// 給arr1數組的索引爲0元素賦值100
arr1[0] = 100;
// 給arr2數組的索引爲0元素賦值200
arr2[0] = 200;
System.out.println("-----------");
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
兩個變量都指向了同一個數組,無論通過哪個變量操作數組,對方都會受到影響。
package com.mobaijun;
public class Demo3 {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 定義數組變量arr2,將arr的地址賦值給arr2
// arr和arr2指向堆中同一個數組
int[] arr2 = arr;
arr2[0] = 111;
arr2[1] = 222;
arr2[2] = 333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
結語:Java虛擬機內存圖對於理解Java程序非常的關鍵,大家應該熟悉數組代碼的內存機制,對於學習Java技術幫助很大。
補充: