建立對象記憶體分析
代碼示例
public class Pet {
public String name;
public int age;
//無參構造器
public void shout(String name){
System.out.println(name + "叫了一聲");
}
}
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout(dog.name);
System.out.println(dog.name);
System.out.println(dog.age);
System.out.println("==================");
Pet cat = new Pet();
System.out.println(cat.name);
System.out.println(cat.age);
}
}
//輸出結果
旺财叫了一聲
旺财
3
==================
null
0
Process finished with exit code 0
對象記憶體分析圖如下:
簡單小結:類與對象
1.類與對象
類是一個模闆:抽象,對象是一個具體的執行個體
2.方法
定義,調用!
3.對應的引用
引用類型:基本類型(八個)
對象是通過引用來操作的:棧--->堆
4.屬性:字段Field 成員變量
預設初始化:
數字:0 0.0
char:u0000
boolean:false
引用:null
修飾符 屬性類型 屬性名 = 屬性值!
5.對象的建立和使用
必須使用new 關鍵字創造對象,構造器 Person cuijiuba = new Person();
對象的屬性 cuijiuba.name
對象的方法 cuijiuba.sleep()
6.類
靜态的屬性 屬性
動态的行為 方法
封裝、繼承、多态
每日Java面試題
一、非阻塞I/O(nonblocking IO)
非阻塞I/O模型,我們把一個套接口設定為非阻塞就是告訴核心,當所請求的I/O操作無法完成時,不要将程序睡眠,而是傳回一個錯誤。這樣我們的I/O操作函數将不斷的測試資料是否已經準備好,如果沒有準備好,繼續測試,直到資料準備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。
當使用者程序發出read操作時,如果kernel中資料還沒準備好,那麼并不會block使用者程序,而是立即傳回error,使用者程序判斷結果是error,就直到資料還沒準備好,使用者可以再次發read,直到kernel中資料準備好,并且使用者再一次發read操作,産生system call,那麼kernel馬上将資料拷貝到使用者記憶體,然後傳回;是以nonblockingIO的特點是使用者程序需要不斷的主動詢問kernel資料好了沒有。
阻塞IO一個線程隻能處理一個IO流事件,要想同時處理多個IO流時間要麼多線程要麼多程序,這樣做效率顯然不會高,而非阻塞IO可以一個線程處理多個流事件,隻要不停地詢所有流時間即可,當然這個方式也不好,當大多數流沒有資料時,也是會大量浪費CPU資源;為了避免CPU空轉,引進代理(select和poll,兩種方式相差不大),代理可以觀察多個流I/O事件,空閑時會把目前線程阻塞掉,當有一個或多個I/O事件時,就從阻塞态醒過來,把所有IO流都輪詢一遍,于是沒有IO事件我們的程式就阻塞在select方法處,即便這樣依然存在問題,我們從select出隻是知道IO事件發生,卻不知道是哪幾個流,還是隻能輪詢所有流,epoll這樣的代理就可以把哪個流發生怎樣的IO事件通知我們;
二、I/O多路複用模型(IO multiplexing)
I/O多路複用就在于單個程序可以同時處理多個網絡連接配接IO,基本原理就是select,poll,epoll這些個函數會不斷輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序,這三個functon會阻塞程序,但和IO阻塞不同,這些函數可以同時阻塞多個IO操作,而且可以同時對多個讀操作,寫操作IO進行檢驗,直到有資料到達,才真正調用IO操作函數,調用過程如下圖;是以IO多路複用的特點是通過一種機制一個程序能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中任意一個進入就緒狀态,select函數就可以傳回。
IO多路複用的優勢在于并發數比較高的IO操作情況,可以同時處理多個連接配接,和blocking IO一樣socket是被阻塞的,隻不過在多路複用中socket是被select阻塞,而在阻塞IO中是被socket IO給阻塞。
三、信号驅動I/O模型
可以用信号,讓核心在描述符就緒時發送SIGIO信号通知我們,通過sigaction系統調用安裝一個信号處理函數。該系統調用将立即傳回,我們的程序繼續工作,也就是說它沒有被阻塞。當資料報準備好讀取時,核心就為該程序産生一個SIGIO信号。我們随後既可以在信号處理函數中調用recvfrom讀取資料報,并通知主循環資料已經準備好待處理。特點:等待資料到達期間程序不被阻塞。主循環可以繼續執行,隻要等待來自信号處理函數的通知:既可以是資料已準備好被處理,也可以是資料報已準備好被讀取。