Erlang與Java內存架構

我讀了一篇關于Erlang VM的內存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰寫的論文 ,我認為討論Erlang的內存設置和Oracle的Java VM之間的差異可能會很好。

作為對從未聽說過Erlang的人的真正的簡短介紹; 它是一種功能語言,使用異步消息傳遞作為并發的基礎。 消息傳遞使用復制語義,從而可以在多個以上的Erlang VM上分發,并且在對一臺機器實質上透明的程序員上運行。

從某種意義上說, Erlang和Java都是相似的,它們都使用虛擬機將硬件抽象為可移植層。 兩種語言都使用與機器無關的字節碼。 兩種運行時系統都依靠垃圾回收來釋放程序員進行內存管理的能力。

Erlang中的線程開銷非常低。 我相信Erlang中的線程的內存要求約為512字節。 在Java中,線程通常需要大約512 KB,大約是1000倍。 對于程序員來說,結果是創建線程來異步執行某些工作不是您必須坐下來思考的事情。 典型的Erlang系統具有成千上萬的線程。 像我們在Java中那樣,線程池和執行器沒有麻煩。

從我所涉獵的內容來看,我發現Erlang是功能語言與允許您編寫實際應用程序的語言之間的一種令人愉快的折衷。 (我知道我會為此感到遲疑)強大的分布式錯誤處理令人驚喜,編寫任何類型的網絡服務器實際上都很容易。 Web服務器的狀態機方法使回滾錯誤變得完全自然。

但是這篇文章不是關于Erlang的編程模型的。 這是關于Erlang VM處理內存的方式。

當前的Java虛擬機使用Erlang程序員稱為共享堆拓撲的東西。 所有線程都使用一個大堆。 大多數內存分配在該堆上。 除了堆之外,JVM還使用一些專用數據區域,例如代碼緩存和永久生成。 這些也在所有線程之間共享。

相比之下, Erlang使用私有堆拓撲。 每個線程都有自己的微小堆,該堆包含該線程使用的所有數據以及該線程的堆棧。 線程的所有數據都在該本地堆上。 創建線程時保留它。 當線程死亡時,整個堆將簡單地返回到空閑內存池。

除了私有堆之外,所有線程都共享對所謂的二進制堆和消息堆的訪問。 這些是專門的堆。 二進制堆用于分配可能在線程之間共享的大塊任意數據。 例如,這是文件輸入或網絡緩沖區所在的位置。

消息堆是消息中使用的數據的堆。 消息也在進程之間共享。 通過將指針從發送線程復制到接收線程,可以在線程之間傳遞消息。 消息的數據存儲在消息堆上。

Erlang內存模型給我留下了深刻的印象。 它比Java的單堆模型具有更大的可擴展性。 語言語義和內存模型完美匹配。

例如; 堆是線程專用的一個簡單事實可以減輕線程對自己數據的所有形式的鎖檢查的負擔。 除此之外,沒有破壞性的寫操作,并且突然也不需要對共享數據進行鎖定檢查。

最新版本的Erlang VM通過擁有多個調度程序,進一步邁出了又一步。 確切地說,每個物理處理器一個調度程序。 這樣就消除了另一類要檢查的鎖。 僅在無聊的調度程序時,它才需要出去,收集一個鎖,并從另一個調度程序中獲取一些進程。

在Java中,我們還有很多東西要學習。 就是說,我們在Java中有一些不錯的東西,我錯過了使用大型Erlang系統的情況。

當線程累積大量數據時, Erlang VM將重新分配并增加堆。 但是,重新分配算法導致堆大小快速增長。 在高負載下,我們已經看到Erlang VM在幾分鐘之內吞噬了16GB的RAM。 每個發行版都必須經過仔細的負載測試,以查看其內存需求是否仍然合理。

Erlang VM中沒有任何機制可以抑制內存的增長。 VM會愉快地分配過多的內存,以至于系統需要進行交換,或者虛擬內存已用完。 這些可能會導致機器甚至無法響應KVM控制臺訪問。 過去,我們不得不關閉機器并重新啟動,才能再次使用它們。

基于隊列的編程模型使Erlang為其編寫代碼變得非常有趣,這也是生產中的致命弱點。 Erlang中的每個隊列都是無界的。 VM不會引發異常或限制隊列中的消息數。 有時,進程會由于錯誤而停止處理,或者進程無法跟上發送給它的消息流的速度。 在這種情況下, Erlang將只允許該進程的隊列增加,直到VM被殺死或機器被鎖定(以先到者為準)。

這意味著,當您在生產環境中運行大型Erlang VM時,您需要進行OS級別的檢查,如果內存使用過多的話,這些檢查將殺死進程。 對于運行大型Erlang VM的計算機,必須具有計算機的遠程控制權或遠程訪問卡。

總之,對于每天的性能,我相信私有堆內存模型是Erlang盒子中非常強大的工具。 它將鎖定機制的所有類都排除在運行時系統之外,這意味著在相同的目的下,它將比Java更好地擴展。 當系統被洪水或DDoSed攻擊時,Java對內存的嚴格限制將節省您的培根。

最后的想法

Erlang的VM有一個命令行開關,可以將其從使用私有堆拓撲切換到使用共享堆拓撲。

我喜歡Erlang和Java。 它們之所以難以比較,是因為它們與開發人員的共同點很少。 通常,我會在大多數系統上使用Java。 工具支持更好,可用庫的數量驚人。 如果我有一個面向流的消息傳遞系統,我會選擇Erlang 。 那時, Erlang編程模型才真正發光。

參考文獻:

  • 我們的JCG合作伙伴Kees Jan Koster (來自Java-Monitor)的 Erlang內存架構與Java內存架構

編碼愉快! 不要忘記分享!

拜倫

相關文章:

  • Java最佳實踐系列
  • 正確記錄應用程序的10個技巧
  • 每個程序員都應該知道的事情
  • 生存在狂野西部開發過程中的9條提示
  • 軟件設計法則
  • Java Fork / Join進行并行編程

翻譯自: https://www.javacodegeeks.com/2011/04/erlang-vs-java-memory-architecture.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374772.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Xuggler教程:轉碼和媒體修改

注意:這是我們的“ Xuggler開發教程 ”系列的一部分。 在之前的教程中,我對視頻處理Xuggler進行了簡短介紹 。 在這一部分中,我們將看到Xuggler和FFmpeg提供的一些更令人興奮的功能,例如視頻轉碼和媒體修改。 不要忘記Xuggler是一…

Web工程師必備的43款可視化工具

國外站點DATAVISUALIZATION.CH為大家總結出了當前熱用的43款可視化工具,包括Arbor、Chroma.js、D3.js、Google Chart Tools等,絕對讓你一飽眼福。 1.Arbor.js Arbor是一個免費的、可視化的圖形庫,基于矢量創建動態的連接圖。它為圖形組織和屏…

力扣7. 整數反轉

方法一&#xff1a;官方給的&#xff0c;自己懂了后照著敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判斷條件過于復雜&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name屬性

被這個不起眼的屬性折磨了一天&#xff0c;終于解決了。 由于項目需要&#xff0c;要合并兩個android應用&#xff0c;于是拷代碼&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序還是頻頻崩潰&#xff0c;一直沒有找到原因&#xff0c;學android…

完美單身

我不時遇到一些Java程序員&#xff0c;他們不確定他們應該如何正確實現Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;請嘗試Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在談論在線程環境中的正確實現。 但是&#xff0c;使用最常見的…

力扣移動零

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 我寫的代碼思路是從開始元素找0&#xff0c;找到了就將這個0后面的元素向前移一位 class Solution {public void moveZeroes(int[] nums) {int n nums.length;…

Doclava:來自Google的自定義Javadoc Doclet

Doclava是Google的自定義Javadoc Doclet&#xff0c;由Google Guice使用&#xff08;請參閱稍冷的 Javadocs &#xff09;。 Doclava使用JSilver作為其模板引擎&#xff0c;這是Clearsilver的純Java實現。 我個人喜歡聯合文檔的想法&#xff0c;它允許文檔在打開的項目上相互鏈…

linux cat顯示若干行

【一】從第3000行開始&#xff0c;顯示1000行。即顯示3000~3999行 cat filename | tail -n 3000 | head -n 1000 【二】顯示1000行到3000行 cat filename| head -n 3000 | tail -n 1000 *注意兩種方法的順序 分解&#xff1a; tail -n 1000&#xff1a;顯示最后1000行 tail -n …

【Stackoverflow好問題】java在,如何推斷陣列Array是否包括指定的值

問題java中&#xff0c;怎樣推斷數組Array是否包括指定的值精華回答1.Arrays.asList(...).contains(...) 2.使用 Apache Commons Lang包中的ArrayUtils.containsString[] fieldsToInclude { "id", "name", "location" };if ( ArrayUtils.contai…

力扣移除元素

給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素&#xff0c;并返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。 元素的順序可以改變。你不需要考慮數組中超出新長度后面…

在域驅動設計中使用狀態模式

域驅動設計&#xff08;DDD&#xff09;是一種軟件開發方法&#xff0c;其中&#xff0c;通過將實現與核心業務概念的不斷發展的模型相連接&#xff0c;可以解決問題的復雜性。 該術語是由Eric Evans創造的&#xff0c;并且有一個DDD專用站點可以促進其使用。 根據其定義&#…

使用selenium進行密碼破解(繞過賬號密碼JS加密)

經常碰到網站&#xff0c;賬號密碼通過js加密后進行提交。通過burp攔截抓到的賬號密碼是加密后的&#xff0c;所以無法通過burp instruder進行破解。只能模擬瀏覽器填寫表單并點擊登錄按鈕進行破解。于是想到了自動化web測試工具selenium&#xff0c;代碼如下&#xff0c;測試效…

力扣刪除排序數組中的重復項

給你一個有序數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。 我沒注意到“有序”這一條…

POJ1789-Truck History .

題目鏈接&#xff1a;http://poj.org/problem?id1789 題目的大概意思就是給你n個字符串。每個字符串只有7的長度。然后分別給這些字符串編號。不同編號之間的距離就是他們有多少個不同的字母。&#xff08;同一個位置字母不相同也算&#xff09;然后一個編號只能由另一個派生…

Java Fork / Join進行并行編程

最近幾年&#xff0c;計算機處理器領域發生了范式轉變。 多年來&#xff0c;處理器制造商一直在提高時鐘頻率&#xff0c;因此開發人員享受到這樣的事實&#xff0c;即他們的單線程軟件執行得更快&#xff0c;而無需他們付出任何努力。 現在&#xff0c;處理器制造商青睞多核芯…

arm-elf-gcc交叉編譯器的使用教程

arm-elf-gcc交叉編譯器的使用教程 一開始需要安裝arm-elf-gcc&#xff0c;但是這是一個32位的程序&#xff0c;我是安裝了64位的系統&#xff0c;據說安裝ia32.libs依賴庫能運行這個&#xff0c;但是看到博客上面前人安裝完了系統圖標少了一半&#xff0c;然后就怕了。經過了翻…

力扣刪除排序數組中的重復項 II

給你一個有序數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 最多出現兩次 &#xff0c;返回刪除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。 思路&#xff1a; 雙指針…

2 android學習資料

http://blog.csdn.net/lmj623565791 http://blog.csdn.net/harvic880925/article/details/50995268轉載于:https://www.cnblogs.com/YyuTtian/p/5440930.html

建立自己的GWT Spring Maven原型

大家好&#xff0c; 在觀看Justin撰寫的有關Spring和GWT的非常有趣的文章時&#xff0c;我認為展示如何構建自己的自定義Maven原型非常有用。我們將展示的原型基于Justin的上一個項目&#xff0c;并包括各種技術&#xff0c;例如Spring &#xff0c; GWT &#xff0c; AspectJ…

C# 連接Oracle數據庫異常總結

這2天因為工作需要連接Oracle數據庫&#xff0c;中間發生了很多問題 一、使用OleDbConnection連接數據庫 ------------------ ProviderOraOLEDB.Oracle.1;User IDsajet;Passwordtech;Data Source(DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.66.225)(…