被問到有關Java內存管理的知識,所以要搜集整理一下了。開始之前,我們要明白一點,我們所使用的變量就是一塊一塊的內存空間!!
創新互聯專注于企業成都全網營銷、網站重做改版、建平網站定制設計、自適應品牌網站建設、H5頁面制作、商城網站建設、集團公司官網建設、外貿網站制作、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為建平等各大城市提供網站開發制作服務。方法名稱 | 參數 | 作用 | 返回值 |
getRuntime | 無 | 獲取 Runtime 對象 | Runtime 對象 |
totalMemory | 無 | 獲取 JVM 分配給程序的內存數量 | long:內存數量 |
freeMemory | 無 | 獲取 當前可用的內存數量 | long:內存數量 |
maxMemory | 無 | 獲取 JVM 可以申請到的大內存數量 | long:內存數量 |
public class Student {
String stuId;
String stuName;
int stuAge;
}
public class TestStudent {
public static void main(String[] args) {
Student s= new Student();
String name= new String("云鶴");
int a = 10;
char b = 'm';
s.stuId= "6363";
s.stuName= "劉德華";
s.stuAge= 25;
}
}
(1)類當然是存放在方法區里面的。
(2)Student s = new Student(); 這行代碼就創建了兩塊內存空間,第一個在棧中,名字叫s,它就相當于指針類型的變量,我們看到它并不存放學生的姓名、年齡等具體的數值,而是存放堆中第二塊內存的地址,第二塊才存放具體的數值,如學生的編號、姓名、年齡等信息。 (3)int a = 10; 這是 基本數據類型 變量,具體的值就存放在棧中,并沒有只指針的概念! 下圖就是本例的內存布置圖:public class TestArray {
void change(int[] arr) {
for(int i=0;i<arr.length;i++)
if(i%2==0)
arr[i]=1000;
System.out.println("方法體內修改值后:" );
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
}
public static void main(String[] args) {
int[] a = {1,2,3,4};
TestArray testString= new TestArray();
System.out.println("方法調用前:");
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
testString.change(a);
System.out.println("方法調用后:");
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
}
}
輸出結果如下:
方法調用前:
1234
方法體內修改值后:
1000210004
方法調用后:
1000210004
數組實際上也是引用類型,在調用函數的過程中改變了其值。
(2)特例:String
public class TestString {
void change(String str) {
str= "吳奇隆";
System.out.println("方法體內修改值后:" + str);
}
public static void main(String[] args) {
String name= "歌星";
TestString testString= new TestString();
System.out.println("方法調用前:" + name);
testString.change(name);
System.out.println("方法調用后:" + name);
}
結果:
方法調用前:歌星
方法體內修改值后:吳奇隆
方法調用后:歌星
分析:
上例中,雖然參數String 是引用數據類型,但其值沒有發生改變,這是因為String 類是final 的,它是定長,不允許對其進行改變,而StringBuffer(多線程下使用性能優)和StringBuilder(單線程下面使用性能優)是可以改變的。如果這里用StringBuffer和SringBuiler替代,結果和Array的使用一樣,中間結果會被改變。 我們看初始情況,即String name = "歌星";這行代碼運行 完,如下圖:public class TestChange {
void change(Student stu1, Student stu2) {
stu1.stuAge++;
stu2.stuAge++;
Student stu= stu1;
stu1= stu2;
stu2= stu;
}
public static void main(String[] args) {
Student z= new Student();
z.stuName= "張信哲";
z.stuAge= 40;
Student r= new Student();
r.stuName= "任賢齊";
r.stuAge= 30;
System.out.println("交換前z: "+z.stuName+" "+z.stuAge);
System.out.println("交換前r: "+r.stuName+" "+r.stuAge);
TestChange testChange= new TestChange();
testChange.change(z, r);
System.out.println("交換后z: "+z.stuName+" "+z.stuAge);
System.out.println("交換后r: "+r.stuName+" "+r.stuAge);
}
}
運行結果:
交換前z: 張信哲 40
交換前r: 任賢齊30
交換后z: 張信哲41
交換后r: 任賢齊31
網站欄目:JAVA內存管理-創新互聯
本文鏈接:http://vcdvsql.cn/article16/ccscgg.html
成都網站建設公司_創新互聯,為您提供微信小程序、ChatGPT、網站排名、網站設計、全網營銷推廣、網頁設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯