Java隨筆

剛學Java不久,這里記錄日常工作和學習中遇見的問題,都是入門級知識點。

1. Uninstall intellij

由于本地的Jetty一直跑不起來,已經(jīng)影響到日常的開發(fā)工作,在報錯實在沒有辦法解決的情況下,只能選擇格式化重來,在此我表示很傷心。好吧,那就傷心地記錄下intellij idea卸載的過程

macos上選擇應(yīng)用程序intellij,將其移動到廢紙簍里面,這樣其實不能干凈卸載intellij,按照下面步驟可以清理干凈:
rm -rf  /Library//Preferences/IdeaIC13
rm -rf  /Library//Caches/IdeaIC13
rm -rf  /Library//Application Support/IdeaIC13
rm -rf  /Library/Logs/IdeaIC13

清理掉Config, System, Plugins, Logs 應(yīng)該就干凈了。

2. Maven Jetty啟動報錯:PermGen space

報錯內(nèi)容如下:

[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 20 seconds.
But at the first scan i get the following error:
ERROR ContextLoader - Context initialization failed
java.lang.OutOfMemoryError: PermGen space

解決方法,加上:-Xmx1024m -Xms1024m -XX:PermSize=512m

永久區(qū)內(nèi)存溢出.png

有時候我們需要遠程調(diào)試,IDea支持遠程調(diào)試功能:


image.png

將Host和Port改成遠程機器的IP和端口,那么遠程JVM啟動的時候加上參數(shù):
JVM_ARGS ="****(其他參數(shù)) -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8417"

3. Java 主線程和子線程的關(guān)系

Java認為:并不存在java的主線程和子線程之分,都只是個普通的線程。進程的資源是線程共享的,只要進程還在,線程就可以正常執(zhí)行,換句話說線程是強依賴于進程的。也就是說,線程其實并不存在互相依賴的關(guān)系,一個線程的死亡從理論上來說,不會對其他線程有什么影響。JVM可以理解為進程,只要JVM還在線程就有執(zhí)行的機會。
這點跟Golang不同,Golang里面主協(xié)程一旦退出,子協(xié)程就沒有執(zhí)行的機會了,Golang是通過Channel完成多協(xié)程之間的通信。

4. Java 多線程的創(chuàng)建

(1) 繼承Thread
class CustomThread extends Thread {
    @Override
    public void run() {
        System.out.println("子線程ID:"+Thread.currentThread().getId());
        System.out.println("我繼承Thread類,處理任務(wù)的邏輯");
    }
}
public class MoreThread {
    public static void main(String[] args) {
        System.out.println("主線程ID:"+Thread.currentThread().getId());
        new CustomThread().start();
    }
}
(2) 實現(xiàn)Runnable
class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("子線程ID:"+Thread.currentThread().getId());
        System.out.println("我實現(xiàn)Runnable接口, 處理任務(wù)的邏輯");
    }
}
public class MoreThread {
    public static void main(String[] args) {
        System.out.println("主線程ID:"+Thread.currentThread().getId());
        new Thread(new MyThread()).start();
    }
}
(3) ExecutorService、Callable、Future有返回結(jié)果的多線程

class CallableImpl implements Callable<Integer> {
    public Integer call() throws Exception {
        Integer sum = 0;
        System.out.println("Callable子線程開始計算啦!");
        for (int i=0; i<50; i++){
            sum = sum + I;
        }
        System.out.println("Callable子線程計算結(jié)束!");
        return sum;
    }
}

public class MoreThread {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        CallableImpl callable = new CallableImpl();
        Future<Integer> future = executorService.submit(callable);
        executorService.shutdown();
        try{
            Thread.sleep(2000);
            System.out.println("主線程有其他任務(wù)在執(zhí)行");
            if (future != null && future.get() != null) {
                System.out.println("future.get()-->"+future.get());
            } else {
                System.out.println("future.get()未獲取到結(jié)果");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主線程在執(zhí)行完成");
    }
}

5. Java 泛型

Java泛型出來之前,java是如何做泛型的呢?

private static void print(Object object) {
        System.out.println(object.getClass().getName().toString());
        if (object instanceof Integer) {
            System.out.println(1);
        } else if (object instanceof String) {
            System.out.println("cd1");
        }

    }

是的,通過反射或者強制類型轉(zhuǎn)化來達到類型匹配的目的。Java中的Object就相當于Golang中的interface,容納一切類型。
Java的泛型非常強大,強大到無處不在。同時Java的泛型只在編譯階段有效,在編譯之后程序會采取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結(jié)果后,會將泛型的相關(guān)信息擦出,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說,泛型信息不會進入到運行時階段。http://www.itdecent.cn/p/95f349258afbhttp://blog.csdn.net/s10461/article/details/53941091文章寫得不錯。
Java中泛型分為:泛型類,泛型方法,泛型接口三大類。Java的泛型通配符?, T, K,V,E的含義:

? 表示不確定的java類型
** T (type)** 表示具體的一個java類型
K V (key value) 分別代表java鍵值中的Key Value
E (element) 代表Element

6. Maven

maven是java中非常棒的包管理工具,如果你想發(fā)布一個jar包到平臺上去,只需要執(zhí)行:mvn deploy。但經(jīng)常會出現(xiàn):

Error occurred during initialization of VM
Too small initial heap

解決方法:

export MAVEN_OPTS=-Xmx1024m

加到環(huán)境變量里面,然后 source /etc/profile 即可。

7. ThreadLocal

先給出它的用途,ThreadLocal和Synchonized都用于解決多線程并發(fā)訪問。但它們有本質(zhì)的不同,Synchronized用于線程間的數(shù)據(jù)共享,而ThreadLocal則用于線程間的數(shù)據(jù)隔離。
這里想問一個問題,Golang為什么不搞一個thread local storage呢?Rob Pike先生是如何看待threadLocal這個東西的呢?

8. DispatcherServlet

Spring是通過DispatcherServlet ->FrameworkServlet->HttpServletBean->HttpServlet->GenericServlet->Servlet,最終實現(xiàn)了Servlet接口,DispatcherServlet又叫前置控制器。DispatcherServlet的主要工作流程如下:

  1. 前端請求到達DispatcherServlet。
  2. 前端控制器請求HandlerMappering 查找Handler。
  3. 如果查找到存在的處理器,進一步去調(diào)用service和dao層
  4. 返回結(jié)果再到controller層,渲染具體的視圖,返回結(jié)果給頁面。

9. Synchronized

類方法中synchronized鎖住的是對象this,只有調(diào)用同一個對象的方法才需要獲取鎖。
靜態(tài)方法中synchronized鎖住的是類,該類中所有加了synchronized的靜態(tài)方法,一次只能調(diào)用一個。
這里必須強調(diào)的是:當一個對象被創(chuàng)建時候,JVM會為這個對象創(chuàng)建一個自引用的指針this,所以this只能在類的非靜態(tài)方法中使用,this和對象之間是一一對應(yīng)關(guān)系,不是和類一一對應(yīng),這個需要特別注意的點。同一個類的不同實例(對象)this不是一個東西。

10. JVM鎖優(yōu)化

image.png

對象鎖的狀態(tài)分為四種: 無鎖,輕量級鎖,重量級鎖和偏向鎖。偏向鎖是JDK1.6提出來的一種鎖優(yōu)化的機制,默認是開啟的。這么多鎖的目的是為了盡可能提高鎖的性能,降低鎖帶來的系統(tǒng)性能損耗。http://blog.csdn.net/zhxdick/article/details/61916359

11. Java Reference

Java的引用分四個級別:強,軟(SoftReference),弱(WeakReference),虛(PhantomReference);
強引用就是普通引用,A a1=new A(); A a2 = a1; 當所有A的引用a1, a2都失效之后,new出來的A()對象才能被回收。如果對象的內(nèi)存大小超出之后,直接報“java.lang.OutOfMemoryError”。
軟引用用來描述還有用并非必要的對象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會把這些對象列入回收范圍進行第二次回收。如果這次回收還沒有足夠的內(nèi)存,才會拋出內(nèi)存溢出異常。
弱引用也是用來描述非必要對象的,但是他的強度比軟引用更弱一些,被軟引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前。當垃圾收集器工作時,無論當前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象。
一個對象是否有虛引用的存在,完全不會對其生存時間構(gòu)成影響,也無法通過虛引用來獲取一個對象的實例。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一個系統(tǒng)通知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,272評論 6 342
  • 有點懶得把圖片傳上來了,請移步這里看 Cocos官方論壇-wiki CocoaChina論壇帖子 上面兩個是一樣的...
    椒鹽老蟶閱讀 5,525評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • Java技術(shù)版圖-awesome-java aewsome-java是github上一個開源項目,搜集Java各領(lǐng)...
    靜默虛空閱讀 4,653評論 0 44
  • 最近一段時間感情波動較大,不應(yīng)該處于這種狀態(tài)了,要適當?shù)母淖円幌伦晕?!讓自己的狀態(tài)走入正軌中,每個細節(jié)都會影響到自...
    OO碰到OO閱讀 195評論 1 0

友情鏈接更多精彩內(nèi)容