1. 程式人生 > 其它 >常用監控命令-pidstat

常用監控命令-pidstat

Java基礎複習

Java語言特點

  1. 簡單易學;
  2. 面向物件(封裝,繼承,多型);
  3. 平臺無關性( Java 虛擬機器實現平臺無關性);
  4. 支援多執行緒( C++ 語言沒有內建的多執行緒機制,因此必須呼叫作業系統的多執行緒功能來進行多執行緒程式設計,而 Java 語言卻提供了多執行緒支援);
  5. 可靠性;
  6. 安全性;
  7. 支援網路程式設計並且很方便( Java 語言誕生本身就是為簡化網路程式設計設計的,因此 Java 語言不僅支援網路程式設計而且很方便);
  8. 編譯與解釋並存;
  9. 在企業級開發中有極其強大的生態

JVM

Java 虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM 有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。(實現跨平臺的特性)。


.java檔案可以被Javac程式編譯成.class位元組碼檔案,JVM在將其解釋成機器可執行的機器碼。(JVM只面向位元組碼,只要符合JVM位元組碼規範的都可以執行,無論位元組碼是由Java檔案編譯過來還是python檔案都可以執行)

Java資料型別


Java具有確定的資料型別,它不像其它的程式語言一樣會隨著硬體的架構變換而變化,這也是Java比其他語言具有更好的可移植性的原因之一。

boolean 只有兩個值:true、false,可以使用 1 bit 來儲存,但是具體大小沒有明確規定。JVM 會在編譯時期將 boolean 型別的資料轉換為 int,使用 1 來表示 true,0 表示 false。JVM 支援 boolean 陣列,但是是通過讀寫 byte 陣列來實現的。

基本型別都有對應的包裝型別,基本型別與其對應的包裝型別之間的賦值使用自動裝箱與拆箱完成。以Integer為例

Integer x = 2;     // 裝箱 呼叫了 Integer.valueOf(2)
int y = x;         // 拆箱 呼叫了 X.intValue()

面試題

Integer x = new Integer(124);
Integer y = new Integer(124);
System.out.println(x == y);    // false
Integer z = Integer.valueOf(123);
Integer w = Integer.valueOf(123);
System.out.println(z == w);		// true
Integer k = 123;
System.out.println(w == k);		// true

x,y是兩個不同的物件,他們不相等可以理解,那麼為什麼z == w呢?這就涉及到Java裡面的快取池技術了。以Integer為例,Java會快取-128 ~127範圍內的物件,呼叫Integer.valueOf()會判斷傳入的值在不在範圍,若在直接返回快取池裡的物件

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
static final int low = -128;
static final int high;
static final Integer cache[];

static {
    // high value may be configured by property
    int h = 127;
    String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    if (integerCacheHighPropValue != null) {
        try {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        } catch( NumberFormatException nfe) {
            // If the property cannot be parsed into an int, ignore it.
        }
    }
    high = h;

    cache = new Integer[(high - low) + 1];
    int j = low;
    for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);

    // range [-128, 127] must be interned (JLS7 5.1.7)
    assert IntegerCache.high >= 127;
}


在 jdk 1.8 所有的數值類緩衝池中,Integer 的緩衝池 IntegerCache 很特殊,這個緩衝池的下界是 - 128,上界預設是 127,但是這個上界是可調的,在啟動 jvm 的時候,通過 -XX:AutoBoxCacheMax= 來指定這個緩衝池的大小,該選項在 JVM 初始化的時候會設定一個名為 java.lang.IntegerCache.high 系統屬性,然後 IntegerCache 初始化的時候就會讀取該系統屬性來決定上界。

為什麼浮點型資料沒有快取池?
你能說出 0~1直接到底有多少個浮點型資料不?

Java引數傳遞

Java的引數傳遞都是值傳遞而不是引用傳遞,對應基本資料型別,Java會拷貝一份值,然後傳遞到形參中,對於引用資料型別Java會把引用的地址以值的形式傳遞給形參。
示例:

public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;

    swap(num1, num2);

    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);
}

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    System.out.println("a = " + a);
    System.out.println("b = " + b);
}
/*
*結果:
 * num1 = 10;
 * num2 = 20;
 * a = 20;
 * b = 10;
*/

分析

class PassByValueExample {
    public static void main(String[] args) {
        Dog dog = new Dog("A");
        func(dog);
        System.out.println(dog.getName());          // B
    }

    private static void func(Dog dog) {
        dog.setName("B");
    }
}
// 結果: B

final關鍵字

  • final關鍵字修飾類,類不能被繼承,類裡的所有方法都隱式的被final關鍵字修飾
  • final關鍵字修飾方法,方法不能被重寫,private方法被final關鍵字隱式修飾
  • final關鍵字修飾變數,變數就為編譯時常量,在執行時可以通過反射進行修改,若final變數賦予了初始值,在編譯期進行了優化 return (final) var ---> retunrn var的字面量。

static關鍵字

  • 修飾成員變數和成員方法: 被 static 修飾的成員屬於類,不屬於單個這個類的某個物件,被類中所有物件共享,可以並且建議通過類名呼叫。被 static 宣告的成員變數屬於靜態成員變數,靜態變數 存放在 Java 記憶體區域的方法區。呼叫格式:類名.靜態變數名 類名.靜態方法名()
  • 靜態程式碼塊: 靜態程式碼塊定義在類中方法外, 靜態程式碼塊在非靜態程式碼塊之前執行(靜態程式碼塊—>非靜態程式碼塊—>構造方法)。 該類不管建立多少物件,靜態程式碼塊只執行一次.
  • 靜態內部類(static 修飾類的話只能修飾內部類): 靜態內部類與非靜態內部類之間存在一個最大的區別: 非靜態內部類在編譯完成之後會隱含地儲存著一個引用,該引用是指向建立它的外圍類,但是靜態內部類卻沒有。沒有這個引用就意味著:1. 它的建立是不需要依賴外圍類的建立。2. 它不能使用任何外圍類的非 static 成員變數和方法。

Java異常體系


Java異常分為Exceptions 和 Errors,他們都繼承與Throwable。

  • Exception:程式能處理的異常,可以通過try,catch處理掉,其又分為受檢查Exceptions和非受檢查異常
  • Errors:程式自己不能處理的異常,如記憶體溢位異常,棧溢位異常,發生這種異常虛擬機器會選擇結束掉執行緒
  1. 受檢查異常
    Java 程式碼在編譯過程中,如果受檢查異常沒有被catch/throw處理的話,就沒辦法通過編譯 。
    除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於受檢查異常 。常見的受 檢查異常有: IO 相關的異常、ClassNotFoundExceptionSQLException...。
  2. 非受檢查異常
    Java 程式碼在編譯過程中 ,我們即使不處理不受檢查異常也可以正常通過編譯。
    RuntimeException及其子類都統稱為非受檢查異常,例如:NullPointerExceptionNumberFormatException(字串轉換為數字)、ArrayIndexOutOfBoundsException(陣列越界)、ClassCastException(型別轉換錯誤)、ArithmeticException(算術錯誤)等。