網(wǎng)站備案密碼十大跨境電商erp排名
所有的文件都存在硬盤上,首次使用的時候才會進入內(nèi)存
進程:有自己的Main方法,并且依賴自己Main運行起來的程序。獨占一塊內(nèi)存區(qū)域,互不干擾。內(nèi)存中有一個一個的進程。
操作系統(tǒng)只認識c語言。操作系統(tǒng)調(diào)度驅(qū)動管理硬件,所以賣硬件的時候要配驅(qū)動,要不用戶不會用,而驅(qū)動基本以c語言為主,操作系統(tǒng)直接調(diào)動驅(qū)動(以驅(qū)動為主),所以只認識c語言。
- java等語言會轉(zhuǎn)成c語言,操作系統(tǒng)在內(nèi)存上運行他們。
- 操作系統(tǒng)是內(nèi)存管理的核心組件,它負責協(xié)調(diào)和優(yōu)化內(nèi)存的使用,以確保計算機系統(tǒng)高效、穩(wěn)定地運行。
用數(shù)組以c語言申請空間。java把內(nèi)存空間分成五大份如下:
方法區(qū)
只寫了這兩個常量池
Test.java:
package 內(nèi)存圖;public class Test {public static void main(String[] mmm) {Person x1 = new Person();}public static void m1() { }public static void m2() {}public static void m3() {}public static void m4() {}public static void m5() {}public void m6() {}
}
Person.java:
package 內(nèi)存圖;public class Person{public int age;public String name;public static int flag;public void m1(){ //static--靜態(tài)修飾}public void m2(){}public static void m3(){}
}
static有無的區(qū)別:
靜態(tài)方法(有顏色的那部分)實際存儲在靜態(tài)常量池,類信息常量池只是指向它的指針
靜態(tài)的方法可以調(diào)用靜態(tài)的,非靜態(tài)的可以調(diào)用靜態(tài)的和非靜態(tài)的。被static方法修飾的可以直接被調(diào)用。解釋如下:
靜態(tài)的相當于被創(chuàng)造出來了,可以直接調(diào)用。非靜態(tài)的沒有被造出來,不能直接調(diào)用,但是同級別的都在圖紙上,非靜態(tài)之間可以互相被調(diào)用。
棧,堆
方法被調(diào)用是拷貝一份入棧,方法執(zhí)行完畢之后就會出棧。
package 內(nèi)存圖;public class Test {public static void main(String[] mmm) { Person x1 = new Person();//基本類型的值和句柄在一塊int a = 9;//引用類型,無法預估大小,b是個變量,沒辦法在棧中申請空間,它的句柄(變量)與值沒有在一塊String b = "asd";m1();m2();int c = 20;if(a < c) {int k = 12;if(k > a)//作用域的內(nèi)部原理:(超作用域就不能操作了)//在此范圍內(nèi)新聲明變量的句柄要被消掉,找對應的括號,執(zhí)行完之后在他里面聲明的變量都要被摧毀{String w = b;}}}public static void m1() {m3();}public static void m2() {m4();}public static void m3() {m5();}public static void m4() {//靜態(tài)被創(chuàng)造出來了,不再創(chuàng)造了,所以要創(chuàng)造非靜態(tài)的。調(diào)動方法的話也是調(diào)動創(chuàng)造出來的方法(白色的:非靜態(tài)的),拷貝這個創(chuàng)造出來的方法入棧//靜態(tài)的方法或?qū)傩栽诜椒▍^(qū)的靜態(tài)常量池里面只有一份,非靜態(tài)的方法在每個對象里面都有一份Person xx = new Person(); // Person類型的,底層是指針 *xx = (*)maolloc(); 申請空間xx.m1();Person xx2 = new Person();xx2.m2();xx.m2();//靜態(tài)的可以通過類或?qū)ο髞碚{(diào)用(指針可以直接調(diào)用靜態(tài)常量池里面的),非靜態(tài)的只能通過對象來調(diào)用。Person.m3(); }public static void m5() {}public void m6() {}
}
- 基本類型的值和句柄在一塊;
- 引用類型,無法預估大小,b是個變量,沒辦法在棧中申請空間,它的句柄(變量)與值沒有在一塊,與 c語言的指針一模一樣。
調(diào)用一個方法之后,該方法入棧之后要運行,此時其他方法都停止運行。只有最上面的方法才會運行,變成最上面了就會恢復運行。運行完畢會出去。一個方法下面的方法就是調(diào)動它的方法。
//靜態(tài)被創(chuàng)造出來了,不再創(chuàng)造了,所以要創(chuàng)造非靜態(tài)的。調(diào)動方法的話也是調(diào)動創(chuàng)造出來的方法(右邊白色的:非靜態(tài)的),拷貝這個創(chuàng)造出來的方法入棧
//靜態(tài)的方法或?qū)傩栽诜椒▍^(qū)的靜態(tài)常量池里面只有一份,非靜態(tài)的方法在每個對象里面都有一份。其他語言也是如此。
里面實際是這樣的(指針的大小通常是4字節(jié)(在32位系統(tǒng)上)或8字節(jié)(在64位系統(tǒng)上))
下面的二進制每次都是讀一部分
c語言中要自己寫free()回收內(nèi)存,java中有垃圾回收機制,沒人指向的話就會自動回收。
- 堆中常量池中生成的沒人指向不會被銷毀,除非常量池內(nèi)存不夠了;其他地方生成的沒人指向會被回收。
進程的組成單位是線程(以上的所有過程),線程---依托棧結(jié)構(gòu)完成了一條線的方法的調(diào)用,線程的組成單位是方法。
程序計數(shù)器:配合棧使用,記錄方法的開始結(jié)束、變量的有效范圍等
本地方法棧:操作系統(tǒng)本身,進行同步翻譯(把自定義的c語言轉(zhuǎn)換成操作系統(tǒng)所帶的c語言)
任何程序的運行都需要硬件來實現(xiàn),對硬件的操控需要驅(qū)動,操作系統(tǒng)內(nèi)核來調(diào)度驅(qū)動(不能同時驅(qū)動)
java變成c語言(java自定義c),把自定義的c語言方法翻譯成操作系統(tǒng)內(nèi)的c(通過本地方法棧)
一個程序的地址的長度都是固定的(32bit / 64bit)
- 指針賦值 (a = "123"):a是一個指向字符的指針。表達式a = "123"意味著將指針a指向一個字符串常量"123"的首地址。改變了指針a的地址,使其指向了新字符串的起始位置。a現(xiàn)在指向了"123"這個字符串。
- 解引用賦值 *a = "123" 是改變指針所指向地址的值,但不能將字符串常量直接賦值給*a。
值不變:
a,b的指向通過w互換了,x1,x2沒有受到影響
方法出棧后,可看到x1,x2沒有受到影響
對別人產(chǎn)生影響:改變它的指向;改變指向區(qū)域的值
值傳遞
傳的是數(shù)字或值的地址 new Person();也是值(對象的地址)
傳這邊的地址:
不同方法中的對象可以指向同一個值
方法1中的對象調(diào)用其他方法,調(diào)用完成后該方法1中的值、指向沒有改變
C語言,java等
引用傳遞
傳x1,x2的地址(句柄的地址)
c++中&a傳的是引用
Sring類型的數(shù)組和二維數(shù)組
String[] arr3 = {"aa","cc",new String("mmm"),"aaa"};
String類型(引用類型)不能在原地存,存的是它的地址
int[] arr1 = {1,2,3,4}; //引用類型 基本類型:byte short int long float double char boolean
arr1 = new int[] {2,2,3,1,3}; //不管長短,不管占不占滿,都新生成一個內(nèi)存頁,不能在原地改
int[] arr2 = arr1;
String[] arr3 = {"aa","cc",new String("mmm"),"aaa"};
arr3[0] = "aaa";
arr3[1] = "aaaa";
Person aa = new Person();
Person[] arr4 = {new Person(), new Person(),aa};
變量不賦值默認都是0
package neicun;
public class test{public static void main(String[] nnn){int[][] arr={{1,2},{2,2},{3},{1,1,4}};int[][] arr2 = new int[3][2];// 3個一維數(shù)組,每個數(shù)組里面有兩個數(shù)字,里面默認都是0arr2[1]=new int[] {3,4,5,6};String[][] arr3 = {{"aa","vv"}, {"cc","ww","ff"}, {new String("xxx")}};int[][][] arr5 = {{ {1},{2,2} },{ {3,4},{1} }};}
}