Java才是世界上最好的語言,Java在高頻交易中替代C++

itread01 2020-11-06 01:35:44
java 才是 世界上 世界 最好


## **高頻交易** 高頻交易是指從那些人們無法利用的極為短暫的市場變化中尋求獲利的計算機化交易,比如,某種證券買入價和賣出價差價的微小變化,或者某隻股票在不同交易所之間的微小价差。在高頻交易中,自動化應用程式每天處理幾億個市場訊號,在全球各地的交易所傳送上千萬個訂單。為了保持業務競爭力,響應時間必須始終保持在微秒級,尤其是在黑天鵝異常事件等高峰期。 高頻交易系統的典型系統結構一般是這樣:金融交易訊號將轉換成內部市場資料格式(交易使用TCP、UDP等各種協議)和多種格式(如二進位制、SBE、JSON、FIX等)。然後,這些標準化的訊息被髮送到演算法伺服器、統計引擎、UI、Log Server和各種資料庫(快取、檔案或分散式資料庫)。任何延遲都會帶來都會帶來高成本的結果。例如,根據根據舊的價格進行決策或下單太遲。為了獲得微秒級的優勢,大部分交易參與者都會投入高價硬體:一個超頻液冷CPU的伺服器池(2020年可以買56核、5.6GHz、1TB記憶體的伺服器),組裝在主交換資料中心、高階納秒級網路交換機、專用跨洋線,甚至是微波網路。 常見的高頻交易系統使用高度定製的Linux核心,並且帶有作業系統旁路,這樣資料就可以直接從網絡卡 "跳轉" 到應用程式、基於IPC 程序間通訊,甚至使用FPGA(可程式設計單用途晶片)。至於程式語言,一般首先想到的就是C++,事實上也確實是這個領域的天然選擇。C++的最大優勢就是執行速度快,最接近機器程式碼,而且是直接根據目標平臺進行編譯,具有高效穩定的特點。 ## 使用Java代替C++ 我們做了一個不同的選擇。在過去14年裡,我們在外匯演算法交易領域用Java進行開發,並使用廉價的硬體代替昂貴的高階裝置。 在一個團隊小,資源有限以及熟練開發人員欠缺的工作環境,Java意味著我們可以快速進行軟體迭代,因為Java生態系統比C系列具有更快的開發效率。可以在早上討論改進措施,並在下午在生產中實施、測試和釋出。 與需要幾周甚至幾個月軟體更新時間的大型公司相比,這是一個關鍵優勢。在這個領域,一個錯誤可以在幾秒鐘內抹去一整年的利潤,因此不能在質量上妥協。我們使用了許多開源庫和專案,實現了嚴格的敏捷開發環境,包括使用Jenkins、Maven、單元測試、夜間構建和Jira。通過Java,開發人員可以專注於業務邏輯,而不是像C++那樣除錯記憶體Coredump或跟指標打交道。而且,由於Java強大的記憶體管理,初級程式設計師也可以立即參與開發程式碼,並且風險可控。 只要有良好的設計模式和乾淨的編碼習慣,就可以用Java達到C++的延遲。我們都知道,使Java成為軟體開發強大和方便語言的原因,同時也是它的缺點的最主要的原因,那就是Java虛擬機器(JVM)。 Java即時編譯程式碼(Just in Time 編譯器),意味著第一次遇到一些程式碼時,也可能產生編譯延遲。Java管理記憶體的方式是通過在堆空間中分配記憶體塊。每隔一段時間,它就會清理這個空間,刪除舊的物件,為新的物件騰出空間。主要問題是,為了進行準確的統計,應用程式執行緒需要被瞬間 "凍結"。這個過程被稱為垃圾收集(GC)。GC是低延遲應用程式開發人員放棄 Java 的主要原因。 市場上Java 虛擬機器最常見和標準的是 Oracle Hotspot JVM,它在 Java 社群中被廣泛使用,主要是出於歷史原因。對於要求非常高的應用程式,Azul Systems 提供了一個很棒的替代方案,稱為 Zing。**Zing是Oracle Hotspot JVM一個強大的替代品。Zing解決了GC暫停和JIT編譯問題。** 讓我們來研究使用Java的固有問題和可能的解決方案。 ## **理解Java即時編譯器** 像C++這樣的語言被稱為編譯語言,因為交付的程式碼完全是二進位制的,可以直接在CPU上執行。PHP或Perl 被稱為解釋語言,因為直譯器(安裝在目標機器上)會邊執行邊編譯每一行程式碼。 Java介於兩者之間;它將程式碼編譯成所謂的 Java 位元組碼,而位元組碼又可以在它認為合適的時候被編譯成二進位制。Java之所以不在啟動時編譯程式碼,與長期的效能優化有關。通過觀察應用程式的執行情況,分析實時的方法呼叫和類的初始化,Java 會編譯經常呼叫的部分程式碼。它甚至可能會根據經驗做出一些假設(這部分程式碼永遠不會被呼叫,或者這個物件永遠是一個 String)。 因此,實際編譯後的程式碼速度非常快,但依然有3個缺點。 1、一個方法需要被呼叫一定的次數來達到編譯閾值,然後才能被優化和編譯(這個限制是可以配置,但通常是10000 次左右的呼叫)。在此之前,未經優化的程式碼並沒有以 "全速" 執行。Java在更快的編譯和高質量的編譯之間做了一個取捨(如果假設不對,會有重新編譯的代價)。 2、當Java應用程式重啟時,又回到了原點,必須等待再次達到這個閾值。 3、有些應用程式(比如我們的場景)有一些不頻繁但很關鍵的方法,這些方法只會被呼叫少數幾次,但當它們被呼叫時,需要極快的速度(想想看,一個風險或止損函式只有在緊急情況下才會被呼叫)。 Azul Zing通過讓其JVM將編譯後的方法和類的狀態 "儲存" 在它所謂的配置檔案中來解決這些問題。這種名為 ReadyNow! 的獨特功能,意味著Java應用程式始終以最佳速度執行,即使在重新啟動後也是如此。當使用現有的配置檔案重新啟動應用程式時,Azul JVM會立即呼叫其先前的結果並直接編譯標註的的方法,從而解決了 Java 預熱問題。 此外,可以在開發環境中建立一個配置檔案,以模擬生產行為。然後,優化後的配置檔案可以部署在生產環境中,因為所有的關鍵路徑都被編譯和優化了。Zing的延遲隨著時間的推移保持相當穩定。百分位數分佈表明,1%的時間裡,Hotspot JVM產生的延遲是 Zing JVM的16倍。 ## 解決垃圾收集(GC)暫停的問題 在垃圾收集過程中,整個應用程式可能會凍結幾毫秒到幾秒不等(延遲隨著程式碼複雜度和堆大小而增加),更糟糕的是,你無法控制這種情況何時發生。雖然暫停一個應用程式幾毫秒甚至幾秒鐘對於許多Java應用程式來說可能是可以接受的,但對於低延遲應用程式來說卻是一場災難,無論是汽車、航空航天、醫療還是金融領域。 GC的影響在Java開發者中是一個很大的話題;一個完整的垃圾收集通常被稱為 "stop-the-world",因為它會凍結整個應用程式。 多年來,許多GC演算法都試圖在吞吐量(多少CPU用於實際的應用邏輯而不是垃圾收集)與 GC暫停之間做一個取捨。 自Java 9以來,G1 收集器一直是預設 GC,其主要思想是根據使用者提供的時間目標來劃分GC暫停時間。它通常提供較短的暫停時間,但代價是較低的吞吐量。此外,暫停時間會隨著堆的大小而增加。Java提供了大量的設定來調整其垃圾收集(以及 JVM),從堆大小到收集演算法,以及分配給GC的執行緒數。所以,看到Java應用程式配置了大量的自定義選項是很常見的。 很多開發者已經轉向各種技術來完全避免GC。主要思路是,如果建立的物件少了,需要清除的物件就會變少。一個古老的技術是使用可重用物件的物件池。例如,一個數據庫連線池將持有10個已開啟的連線的引用,準備在需要時使用。 多執行緒通常需要鎖,這會導致同步延遲和暫停(特別是當它們共享資源時)。一個流行的設計是一個環形緩衝佇列系統,在一個無鎖的設定中,有許多執行緒寫和讀。一些專家甚至選擇完全自己實現 Java 記憶體管理,自己管理記憶體分配,雖然解決了一個問題,但卻帶來了更多的複雜性和風險。在這種情況下,顯然應該考慮其他 JVM,於是我們決定嘗試 Azul Zing JVM。很快,我們就實現了非常高的吞吐量,停頓可以忽略不計。 這是因為Zing使用了一個獨特的收集器,叫做C4(Continuurrentously Concurrent Compacting Collector),它允許無暫停地收集垃圾,而不關心Java堆的大小(最高可達8TB)。這是通過在應用程式仍在執行時,併發對映和壓縮記憶體來實現。此外,它不需要修改任何程式碼,延遲和速度的提升都是開箱即見,無需冗長的配置。在這種情況下,Java程式設計師可以享受到兩全其美的好處,既可以享受到 Java 的簡單性(無需偏執於建立新物件),又可以享受到Zing的底層效能,使整個系統的延遲高度可預測。 多虧了GC easy,一個通用的GC日誌分析器,我們可以在真實的自動交易應用中(在模擬環境中)快速比較兩種JVM。在高頻交易的應用中,使用Zing的GC比使用標準的 Oracle Hotspot JVM 小 180 倍左右。更令人印象深刻的是,GC暫停通常與實際應用暫停時間相對應,而Zing智慧GC通常是在最小或沒有實際暫停的情況下平行發生的。 ## 總結 Java在享受簡單性和麵向業務的特性同時,仍然可以實現高效能和低延遲。雖然C++ 仍然可用於特定的底層元件,如驅動程式、資料庫、編譯器和作業系統,但大多數現實中都可以用Java來開發,包括象高頻交易這樣要求苛刻的應用。 [ java jdk 下載](http://www.sousou88.com/album/javajdkquanji.html) 來自 [嗖嗖下載](http://www.souso
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1604596084.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云