主頁 > 資料庫 > JVM性能優化簡介

JVM性能優化簡介

2020-09-15 12:06:58 資料庫

01. JVM是什么
    概述:
        大白話:
            全稱Java Virtual Machine(Java虛擬機), 它是一個虛構出來的計算機, 通過實際的計算機來模擬各種計算機的功能.
        專業版:
            JVM是一個行程, 用來模擬計算單元, 將.class位元組碼檔案轉成計算機能夠識別的指令.
        //這里可以聯想以前大家學的"VM ware", 它也是一個虛擬機.
        //它們的區別就在于: VM Ware是你能看見的, JVM是你看不見的.
        
    回顧:
        我們以前寫的Java程式是: 撰寫 --> 編譯 --> 運行三個階段的.
        .class檔案是Java語言獨有的, 只有JVM能識別, 其他任何軟體都識別不了.
        所以Java語言的"跨平臺性(一次編譯到處運行)"就是由JVM來保證的.
        
    畫圖演示:
        JVM把.class位元組碼檔案 轉成 計算機能夠識別的指令的程序.
        
    代碼演示:
        D:\compile\Worker.java檔案, 通過"jps"命令查看啟動的行程.
        
    
02. JVM虛擬機運行的流程
    JVM是一個行程,接下來我們來研究它的: 作業機制, 這個問題是很深奧的, 不亞于研究一個完整VM Ware虛擬機,但是諸如"硬碟, CD/DVD這些部分和我們都沒關系", 所以研究JVM的作業機制就是在研究它的: 運算機制.
    首先, 請你思考一個問題: 如果我給你一個A.class位元組碼檔案, 想把它運行起來, 你會做哪些事情?
    
    畫圖演示:
        1. 讀取位元組碼檔案所在的路徑.
            //類加載機制
        2. 獲取位元組碼檔案中具體的內容.
            //方法區: 用來存放類的描述資訊.
        3. 獲取該類的實體(物件)
            //堆(Heap): 用來存盤物件的(所有new出來的內容)
        4. 通過物件名.的方式呼叫方法.
            //堆疊(Stack): 用來存放區域變數及所有代碼執行的.
        
    今天我們的學習順序, 就是按照這個流程來走的.


03. JVM虛擬機類加載機制(一):運行順序
    首先, 我們先來研究JVM的類加載機制, 類加載機制就是把類給讀取出來, 我們來看一下它是如何運行的.
    畫圖演示:
        JVM底層加載類依靠三大組件:
            BootStrapClassLoader    //啟動類加載器
                //負責加載: jre\lib\rt.jar        //rt: runtime, 運行的意思
                //windows最早不支持java, 沒有JRE, 后來Sun公司打官司贏了, windows開始默認支持JRE.
            ExtClassLoader:            //擴展類加載器
                //負責加載: jre\lib\ext\* 檔案夾下所有的jar包
                //這兩個加載器執行完畢后, JVM虛擬機基本上就初始化完畢了.
            APPClassLoader:            //應用程式類加載器
                //負責加載: 用戶自定義的類的.
                //就是加載: 用戶配置的classpath環境變數值的.
            //UserClassLoader        //自定義類加載器
                //自定義類加載器就是自定義一個類繼承ClassLoader, 然后重寫findClass(), loadClass()兩個方法即可.
                
        加載順序是:     BootStrap --> ExtClassLoader --> AppClassLoader --> UserClassLoader
        
    代碼演示:
        1) 隨便撰寫一個A類, 然后演示: jar包的加載程序(rt.jar, ext\*等相關的jar包)
        2) 列印類加載器物件:
             //1. 獲取當前執行緒的類加載器
            ClassLoader load = Thread.currentThread().getContextClassLoader();
            //2. 列印當前執行緒的類加載器.
            System.out.println(load);                           //AppClassLoader
            //3. 列印當前執行緒的類加載器的父類(加載器).
            System.out.println(load.getParent());               //ExtClassLoader
            //4. 列印當前執行緒的類加載器的父類的父類(加載器).
            System.out.println(load.getParent().getParent());   //null: 其實應該是BootStrapClassLoader, 但是它是C語言寫的, 所以列印不出來.
        
        
04) JVM虛擬機類加載機制(二):檢查順序
    剛才我們學完了JVM類加載機制的"加載循序", 現在, 我們來研究下它的"檢查順序", 請你思考,
    假設: D:\compile, ext\*.jar, rt.jar三類中都有 A.class, 那么A.class是否會被加載3次, 如果不會, 它的加載順序是什么樣的?
        不會, BootStrap會加載A.class.
        
    運行順序是:
        bootstrap --> ext --> app
        1) bootstrap先加載 A.class
        2) ext檢查A.class是否加載:
            是: 不加載A.class
            否: 加載A.class
        3) app檢查A.class是否加載:
            是: 不加載A.class
            否: 加載A.class
        
    例如:
        UserClassLoader
        APPClassLoader
        ExtClassLoader
        BootStrapClassLoader
    總結:
        自上而下檢查, 自下而上運行.
    
    
05) JVM的記憶體模型(方法區, 堆區, 堆疊區, 程式計數器)
    到目前為止我們已經知道類加載器是用來加載位元組碼檔案的, 那加載完位元組碼檔案之后, 是不是要運行起來啊?
    那它是怎么運行的呢? 在我的課件中有一個"JVM運行時記憶體資料區", 接下來我們詳細的來學習一下.
    
    1) A.class位元組碼檔案被加載到記憶體.
        //存盤在方法區中, 并且方法區中也包含常量池.
        
    2) 創建本類的實體物件, 存盤在堆中(heap)
    
    3) 通過物件名.的形式呼叫方法, 方法執行程序是在: 虛擬機堆疊中完成的.
        //一個執行緒對應一個虛擬機堆疊, 每一個方法對應一個: 虛擬機堆疊中的堆疊幀
    
    4) 程式計數器區域記錄的是當前程式的執行位置, 例如:
        執行緒1: print(), 第3行
    
    5) 將具體要執行的代碼交給: 執行引擎來執行.
    
    6) 執行引擎呼叫: 本地庫介面, 本地方法庫來執行具體的內容.    
        //這部分了解即可, 用native修飾的方法都是本地方法.
        
    7) 本地方法堆疊: 顧名思義, 就是本地方法執行的區域.(C語言, 外部庫運行的空間)
        //了解即可.
    
    8) 直接記憶體: 大白話翻譯, 當JVM記憶體不夠用的時候, 會找作業系統"借點"記憶體.
        //了解即可.
    
06) JVM的一個小例子    
    1) 撰寫源代碼.
        //創建一個A類, 里邊有個print()方法.
        public class A {
            public void print() {
                System.out.println("h");
                System.out.println("e");
                System.out.println("l");
                System.out.println("l");    
                System.out.println("o");
            }
        }
    
    2) 在A類中, 撰寫main()函式, 創建兩個執行緒, 分別呼叫A#print()方法.
        /*
            java A  //運行Java程式
            加載類:
                1) bootstrap 加載rt.jar
                2) ext 加載 jre\lib\ext\*.jar
                3) app 加載 A.class
            具體運行:
                1) 主函式運行. 堆疊中有個主執行緒, 呼叫MainThread.main();
                2) 執行第23行,  A a = new A(); 將a物件存盤到堆區.
                3) 執行第24行, 呼叫a.print()方法, 生成一個堆疊幀, 壓入主執行緒堆疊.
                -----> 執行, 運行print()方法的5行代碼.

                4) 堆疊中有個新的執行緒, t1,
                    t1 --> run堆疊幀 --> print堆疊幀
                5) 堆疊中有個新的執行緒, t2,
                    t2 --> run堆疊幀 --> print堆疊幀

         */
        public class A {
            public void print() {
                System.out.println("h");
                System.out.println("e");
                System.out.println("l");
                System.out.println("l");
                System.out.println("o");
            }

            public static void main(String[] args) {
                A a = new A();
                a.print();

                //創建兩個執行緒物件, 呼叫A#print();
                //執行緒是CPU運行的基本單位, 創建銷毀由作業系統執行.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        a.print();
                    }
                }).start();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        a.print();
                    }
                }).start();
            }
        }

    3) 畫圖演示此代碼的執行流程.
    4) 時間夠的情況下, 演示下: 守護執行緒和非守護執行緒.
        
        
        
07) 執行緒安全和記憶體溢位的問題
    到目前為止, 大家已經知道了JVM的記憶體模型, 也知道了各個模塊的作用,
    接下來, 請你思考一個問題: 上述的模塊中, 哪些模塊會出現執行緒安全的問題,
    哪些模塊有記憶體溢位的問題?
    
    舉例:
        public class A{
            int i;
            
            public void add() {
                i++;
            }
        }
        //當兩個執行緒同時呼叫add()方法修改變數i的值時, 就會引發執行緒安全問題.
    畫圖演示上述代碼.
    
    結論:
        1) 存在執行緒安全問題的模塊.
            堆: 會.         //多執行緒, 并發, 操作同一資料.
            堆疊:    不會.        //執行緒堆疊之間是相互獨立的.
            方法區:    不會.    //存盤常量, 類的描述資訊(.class位元組碼檔案).
            程式計數器:不會.//記錄程式的執行流程.
        
        2) 存在記憶體溢位問題的模塊.
            堆: 會.         //不斷創建物件, 記憶體被撐爆.
            堆疊: 會.         //不斷呼叫方法, 記憶體被撐爆.
            方法區: 會.     //常量過多, jar包過大, 記憶體被撐爆.
            程式計數器: 會. //理論上來講會, 因為執行緒過多, 導致計數器過多, 記憶體被撐爆.
        
    其實我們研究JVM性能優化, 研究的就是這兩個問題, 這兩個問題也是常見面試題.
    //面試題:說一下你對 執行緒安全和記憶體溢位這兩個問題的看法.
    
    總結:
        研究這兩個問題, 其實主要研究的還是"堆(Heap)記憶體".
        
        
08) JDK1.7的堆記憶體的垃圾回收演算法
    JDK1.7 將堆記憶體劃分為3部分: 年輕代, 年老代, 持久代(就是方法區).
    年輕代又分為三個區域:    //使用的是 復制演算法(需要有足夠多的空閑空間).
        Eden: 伊甸園
            //存盤的新生物件, 當伊甸園滿的時候, 會將存活物件復制到S1區.
            //并移除那些垃圾物件(空指標物件).
        Survivor: 幸存者區1
            //當該區域滿的時候, 會將存活物件復制到S2區
            //并移除那些垃圾物件.
        Survivor: 幸存者區2
            //當該區域滿的時候, 會將存活物件復制到S1區.
            //并移除那些垃圾物件.
        大白話翻譯:
            s1區 和 s2區是來回互相復制的.
    
    年老代:    //使用的是標記清除演算法, 標記整理演算法.
        //當物件在S1區和S2區之間來回復制15次, 才會被加載到: 年老代.
        //當年輕代和年老代全部裝滿的時候, 就會報: 堆記憶體溢位.
    
    持久代:    //就是方法區
        存盤常量, 類的描述資訊(也叫: 元資料).
    
        
09) JDK1.7默認垃圾回收器    //所謂的回收器, 就是已經存在的產品, 可以直接使用.
    Serial收集器:
        單執行緒收集器, 它使用一個CPU或者一個執行緒來回收物件,
        它在垃圾收集的時候, 必須暫停其他作業執行緒, 直到垃圾回收完畢.
        //類似于: 國家領匯入出行(封路), 排隊點餐(遇到插隊現象)
        //假設它在回收垃圾的時候用了3秒, 其他執行緒就要等3秒, 這樣做效率很低.
        
    ParNew收集器:
        多執行緒收集器, 相當于:  Serial的多執行緒版本.
        
    
    Parallel Scavenge收集器:
        是一個新生代的收集器,并且使用復制演算法,而且是一個并行的多執行緒收集器.
        其他收集器是盡量縮短垃圾收集時用戶執行緒的停頓時間,而Parallel Scavenge收集器的目標是達到一個可控制的吞吐量:
            吞吐量 = 運行用戶代碼時間 / (運行用戶代碼時間+垃圾收集時間)
            (虛擬機總共運行100分鐘,垃圾收集時間為1分鐘,那么吞吐量就是99%)
        //因為虛擬機會根據系統運行情況進行自適應調節, 所以不需要我們設定.
        
    CMS收集器:    //主要針對于年老代.
        整個程序分為:
            初始標記;    //用戶執行緒等待
            并發標記;    //用戶執行緒可以執行
            重新標記;    //用戶執行緒等待
            并發清除;    //用戶執行緒可以執行
        可以理解為是:
            精細化運營, 前邊的垃圾收集器都是一刀切(在回收垃圾的時候, 其他執行緒等待), 而CMS是盡可能的降低等待時間, 并行執行程式, 提高運行效率.
    以上為JDK1.7及其以前的垃圾回收器, JDK1.8的時候多了一個: G1.
    G1在JDK1.9的時候, 成為了默認的垃圾回收器.
    
    
    
10) VM宏觀結構梳理
    1) Java程式的三個階段:
        撰寫: A.java
        編譯: javac A.java
        運行: java A.class
        
    2) 類加載器
        bootstrap
        ext
        app
        
    3) JVM的記憶體結構
        堆:
            年輕代
            年老代
            持久代(也就是方法區)
                元資料(類的描述資訊, 也就是.class位元組碼檔案), 常量池
            
        堆疊:
            有n個執行緒堆疊, 每個執行緒堆疊又會有n個堆疊幀(一個堆疊幀就是一個方法)
            
        程式計數器:
            用來記錄程式的執行流程的.
            
        本地方法堆疊:
            C語言, 外部程式運行空間.
            
11) G1垃圾回收器
    在上個圖解上做優化, 用G1新圖解, 覆寫之前堆中的內容.
    
    1) 將記憶體劃分為同樣大小的region(區域).
    2) 每個region既可以是年輕代, 也可以是老年代, 還可以是幸存者區.
    3) 程式運行前期, 創建大量物件的時候, 可以將每個region看做是: Eden(伊甸園).
    4) 程式運行中期, 可以將eden的region變成old的region.
    5) 程式運行后期, 可以縮短Eden, Survivor的區域, 變成Old區域.
        //這樣做的好處是: 盡可能大的利用堆記憶體空間.
    6) H: 存盤大物件的.
    7) G1是JDK1.8出來的, 在JDK1.9的時候變成了: 默認垃圾處理器.
    
    
12) G1中的持久代(方法區)不見了
    方法區從JVM模型中遷移出去了, 完全使用系統的記憶體.
    方法區也改名叫: 元資料區.
    
    
13) 記憶體溢位的代碼演示
    1) 堆記憶體溢位演示: main.java.heap.PrintGC_demo.java
        //創建物件多, 導致記憶體溢位.
        
    2) 堆疊記憶體溢位演示:
        main.java.stack.StackOverFlow(遞回導致的)
        //不設定的話在5000次左右, 設定256K后在1100次左右.
        
        main.java.stack.Thread(不斷創建執行緒導致的)
        //這個自行演示即可, 電腦太卡, 影響上課效果.
        
    3) 方法區記憶體溢位演示:
        main.java.method.MethodOOM        //常量過多
        main.java.direct.DirectMenOOM    //jar包過大, 直接溢位.
        
    總結:
        可能你未來的10年都碰不到JVM性能調優這個事兒, 先不說能不能調優, 而是大多數的
        公司上來就擼代碼, 很少會有"JVM調優"這個動作, 即使遇到了"JVM調優", 公司里邊
        還有架構師呢, 但是我們馬上要找作業了, 把這些相關的題了解了解, 看看, 對面試會
        比較有幫助.
        //JVM調優一般是只看, 不用, 目前只是為了面試做準備.
        
14) 參考地址值比較
    直接演示src.main.method.ATest類中的代碼即可.
    //講解==比較參考型別的場景.
        
    
15) JVM調優案例賞析
    百度搜索 --> JVM調優實踐, 一搜一大堆的案例.
    
    
16) GC的調優工具jstat        //主要針對于GC的.
    1) 通過Dos命令運行 D:\compile\Worker.java
        
    2) 重新開啟一個Dos視窗:
        //可以通過jps指令查看pid值.
        jstat -class 2041(Java程式的PID值)        //查看加載了多少個類
        jstat -compiler 2041(Java程式的PID值)    //查看編譯的情況
        jstat -gc 2041(Java程式的PID值)            //查看垃圾回收的統計        
        jstat -gc 2041 1000 5                    //1秒列印1次, 總共列印5次
        
17) GC的調優工具jmap        //主要針對于記憶體使用情況的.
    1) 通過Dos命令運行 D:\compile\Worker.java
    
    2) jmap -heap 2041(Java程式的PID值)            //查看記憶體使用情況
       jmap -histo 2041 | more                    //查看記憶體中物件數量及大小
       jmap -dump:format=b,file=d:/compile/dump.dat 2041    //將記憶體使用情況dump到檔案中
       jhat -port 9999 d:/compile/dump.dat                  //通過jhat對dump檔案進行分析
            //埠號可以自定義, 然后在瀏覽器中通過127.0.0.1:9999就可以訪問了.
            
            
18) GC的調優工具jstack-死鎖      //針對于執行緒的.  
    1) 執行緒的六種狀態:
        新建, 就緒, 運行(運行的時候會發生等待或者阻塞), 死亡.
        
    2) 撰寫一個死鎖的代碼.
        //兩個執行緒, 兩把鎖, 一個先拿鎖1, 再拿鎖2, 另一個先拿鎖2, 在拿鎖1.
        
    3) 通過jstack命令可以查看Java程式狀態.  
        jstack 2041        //查看死鎖狀態
        
                                                
19) GC的可視化調優工具    //jstat, jmap, jstack
    1) 本地調優.
        1.1) 該工具位于 JDK安裝目錄/bin/jvisualvm.exe
            //雙擊可以直接使用.
            
        1.2) 以IntelliJ Platform為例, 演示下各個模塊的作用.
            
        1.3) 該工具涵蓋了上述所有的命令.
        
    2) 遠程調優.        //自行測驗(目前先了解即可).
        java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9999 DeadLock
        
        這幾個引數的意思是:
            -Dcom.sun.management.jmxremote :允許使用JMX遠程管理
            -Dcom.sun.management.jmxremote.port=9999 :JMX遠程連接埠
            -Dcom.sun.management.jmxremote.authenticate=false :不進行身份認證,任何用戶都可以連接
            -Dcom.sun.management.jmxremote.ssl=false :不使用ssl
    
    
20) JVM的總結
    1) 什么是JVM?
    2) JVM類加載機制.
        //bootstrap, ext, app
    3) JVM記憶體模型.
    4) 垃圾回收演算法.
        復制演算法:
            針對于年輕代.
            
        標記清除演算法:
        標記整理演算法:
            針對于老年代
    5) JVM垃圾回收器.
        Serial單執行緒.
        ParNew多執行緒.
        Parallel Scavenge: 并發多執行緒.
        CMS: 以獲取"最短垃圾回收停頓時間"為目標的收集器.
        G1: JDK1.8出現的, JDK1.9被設定成默認垃圾回收器.
    6)     JVM調優工具:
        jstat, jmap, jstack, 可視化調優工具(jvisualvm.exe).
    
    
//以下內容是為了面試用, 找作業前一周, 看看下面的題即可.
21) JVM的執行緒安全與鎖的兩種方式
    執行緒安全:
        多執行緒, 并發, 操作同一資料, 就有可能引發安全問題, 需要用到"同步"解決.
        
    "同步"分類:
        同步代碼塊:
            格式:
                synchronized(鎖物件) {
                    //要加鎖的代碼
                }
            注意:
                1) 同步代碼塊的鎖物件可以是任意型別的物件.
                    //物件多, 類鎖均可.
                2) 必須使用同一把鎖, 否則可能出現鎖不住的情況.                //String.class
                
        同步方法:
            靜態同步方法:
                鎖物件是: 該類的位元組碼檔案物件.        //類鎖
                
            非靜態同步方法:
                鎖物件是: this                        //物件鎖
    
22) 臟讀-高圓圓是男的
    1) 演示main.java.thread.DirtyRead.java類的代碼即可.
    
    2) 自定義執行緒修改姓名后, 要休眠3秒, 而主執行緒休眠1秒后即呼叫getValue()列印姓名和年齡,
       如果getValue()方法沒加同步, 會出現"臟讀"的情況.
       
23) 了解Lock鎖.
    1) Lock和synchronized的區別
         1.1) synchronized是java內置的語言,是java的關鍵字
        1.2) synchronized不需要手動去釋放鎖,當synchronized方法或者synchronized代碼塊執行完畢,
            系統會自動釋放對該鎖的占用,
            而lock必須手動的釋放鎖,如果沒有主動的釋放鎖,則可能造成死鎖的問題
    2) 示例代碼
        public class Demo02 {
            private Lock lock = new ReentrantLock();

            public void method01() {
                lock.lock();
                System.out.print("i");
                System.out.print("t");
                System.out.print("c");
                System.out.print("a");
                System.out.print("s");
                System.out.print("t");
                System.out.println();
                lock.unlock();
            }


            public void method02() {
                lock.lock();
                System.out.print("我");
                System.out.print("愛");
                System.out.print("你");
                System.out.print("中");
                System.out.print("國");
                System.out.println();
                lock.unlock();
            }
        }

    


https://blogs.oracle.com/jonthecollector/our-collectors
  
    
        


        
        
        
        
        
        
        
        
        
    
   

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/46501.html

標籤:大數據

上一篇:Flink整合oozie shell Action 提交任務 帶kerberos認證

下一篇:ZooKeeper之服務器動態上下線案例

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more