標簽 ‘ JVM

如何成為一位「不那么差」的程序員

前言

已經記不清有多少讀者問過:

博主,你是怎么學習的?像我這樣的情況有啥好的建議嘛?

也不知道啥時候我居然成人生導師了。當然我不排斥這些問題,和大家交流都是學習的過程。

因此也許諾會準備一篇關于學習方面的文章;所以本文其實準備了很久,篇幅較長,大家耐心看完希望能有收獲。

以下內容僅代表我從業以來所積累的相關經驗,我會從硬技能、軟實力這些方面盡量闡述我所認為的?“不那么差的程序員”?應當做到哪些技能。

閱讀全文

如何優雅的使用和理解線程池

前言

平時接觸過多線程開發的童鞋應該都或多或少了解過線程池,之前發布的《阿里巴巴 Java 手冊》里也有一條:

可見線程池的重要性。

簡單來說使用線程池有以下幾個目的:

  • 線程是稀缺資源,不能頻繁的創建。
  • 解耦作用;線程的創建于執行完全分開,方便維護。
  • 應當將其放入一個池子中,可以給其他任務進行復用。

閱讀全文

一次線上問題排查所引發的思考

前言

之前或多或少分享過一些內存模型、對象創建之類的內容,其實大部分人看完都是懵懵懂懂,也不知道這些的實際意義。

直到有一天你會碰到線上奇奇怪怪的問題,如:

  • 線程執行一個任務遲遲沒有返回,應用假死。
  • 接口響應緩慢,甚至請求超時。
  • CPU 高負載運行。

這類問題并不像一個空指針、數組越界這樣明顯好查,這時就需要剛才提到的內存模型、對象創建、線程等相關知識結合在一起來排查問題了。

正好這次借助之前的一次生產問題來聊聊如何排查和解決問題。

閱讀全文

Byte Buddy 教程(1.1)-編寫一個安全的庫

Java 語言帶有一套比較嚴格的類型系統。Java 要求所有變量和對象都有一個確定的類型,并且任何向不兼容類型賦值都會造成一個錯誤。這些錯誤通常都會被編譯器檢查出來,極少情況下會被 Java 運行時檢查到,然后拋一個非法類型的錯誤。如此嚴格的類型在大多數情況下是比較令人滿意的,比如在編寫業務應用時。通常,可以以任何模型元素表示其自己的類型這種明確的方式來描述業務域。通過這種方式,我們可以用 Java 構建具有非常強可讀性和穩定性的應用,應用中的錯誤也非常貼近源碼。除此之外,Java 嚴格的類型系統造就 Java 在企業編程中的普及。

閱讀全文

從單例模式到Happens-Before

本文主要從簡單的單例模式為切入點,分析單例模式可能存在的一些問題,以及如何借助Happens-Before分析、檢驗代碼在多線程環境下的安全性。

閱讀全文

JAVA的內存模型及結構

原文鏈接???譯文鏈接??作者:Tai Truong ? ?譯者:Jaxon

所有的Java開發人員可能會遇到這樣的困惑?我該為堆內存設置多大空間呢?OutOfMemoryError的異常到底涉及到運行時數據的哪塊區域?該怎么解決呢?

Java內存模型

Java內存模型在JVM specification, Java SE 7 Edition, and mainly in the chapters “2.5 Runtime Data Areas” and “2.6 Frames”中有詳細的說明。對象和類的數據存儲在3個不同的內存區域:堆(heap space)、方法區(method area)、本地區(native area)。 閱讀全文

Java代碼到字節碼——第一部分

原文地址?作者:James Bloom 譯者:張坤

理解在Java虛擬機中Java代碼如何別被編譯成字節碼并執行是非常重要的,因為這可以幫助你理解你的程序在運行時發生了什么。這種理解不僅能確保你對語言特性有邏輯上的認識而且做具體的討論時可以理解在語言特性上的妥協和副作用。 閱讀全文

JVM內部原理

JVM內部原理

原文鏈接?原文作者:James D Bloom?翻譯:梅小西(904516706) ?校對:吳京潤

 

這篇文章詳細描述了Java虛擬機的內在結構。下面這張圖來自《The Java Virtual Machine Specification Java SE 7 Edition》,它展示了一個典型的JVM的主要的內部結構。

閱讀全文

G1垃圾收集器介紹

原文鏈接,譯者:Greenster

簡介

Oracle在JDK7 update 4之后開始完全支持G1垃圾收集器,G1是一個針對多處理器大容量內存的服務器端的垃圾收集器,其目標是在實現高吞吐量的同時,盡可能的滿足垃圾收集暫停時間的要求。G1在執行一些Java堆空間中的全區域操作(如:全局標記)時是和應用程序線程并發進行的,因此減少了Java堆空間的中斷比例。(譯者注:可簡單理解為減少了Stop-the-World的時間比例) 閱讀全文

JVM性能優化(三):垃圾收集

原文地址,譯文地址,譯者:Greenster

Java平臺的垃圾收集機制顯著提高了開發者的效率,但是一個實現糟糕的垃圾收集器可能過多地消耗應用程序的資源。在Java虛擬機性能優化系列的第三部分,Eva Andreasson向Java初學者介紹了Java平臺的內存模型和垃圾收集機制。她解釋了為什么碎片化(而不是垃圾收集)是Java應用程序性能的主要問題所在,以及為什么分代垃圾收集和壓縮是目前處理Java應用程序碎片化的主要辦法(但不是最有新意的)。

垃圾收集(GC)的目的是釋放那些不再被任何活動對象引用的Java對象所占用的內存,它是Java虛擬機動態內存管理機制的核心部分。在一個典型的垃圾收集周期里,所有仍然被引用的對象(因此是可達的)都將被保留,而那些不再被引用的對象將被釋放、其所占用的空間將被回收用來分配給新的對象。

為了理解垃圾收集機制和各種垃圾收集算法,首先需要知道關于Java平臺內存模型的一些知識。

閱讀全文

JVM性能優化(一)JVM技術入門

作者 Eva Andreasson ?譯者:趙峰 校對:方騰飛 ?原文鏈接

Java應用程序是運行在JVM上的,但是你對JVM技術了解嗎?這篇文章(這個系列的第一部分)講述了經典Java虛擬機是怎么樣工作的,例如:Java一次編寫的利弊,跨平臺引擎,垃圾回收基礎知識,經典的GC算法和編譯優化。之后的文章會講JVM性能優化,包括最新的JVM設計——支持當今高并發Java應用的性能和擴展。

如果你是一個開發人員,你肯定遇到過這樣的特殊感覺,你突然靈光一現,所有的思路連接起來了,你能以一個新的視角來回想起你以前的想法。我個人很喜歡學習新知識帶來的這種感覺。我已經有過很多次這樣的經歷了,在我使用JVM技術工作時,特別是使用垃圾回收和JVM性能優化時。在這個新的Java世界中,我希望和你分享我的這些啟發。希望你能像我寫這篇文章一樣興奮的去了解JVM的性能。
閱讀全文

聊聊JVM的年輕代

1.為什么會有年輕代

我們先來屢屢,為什么需要把堆分代?不分代不能完成他所做的事情么?其實不分代完全可以,分代的唯一理由就是優化GC性能。你先想想,如果沒有分代,那我們所有的對象都在一塊,GC的時候我們要找到哪些對象沒用,這樣就會對堆的所有區域進行掃描。而我們的很多對象都是朝生夕死的,如果分代的話,我們把新創建的對象放到某一地方,當GC的時候先把這塊存“朝生夕死”對象的區域進行回收,這樣就會騰出很大的空間出來。

閱讀全文

JVM實用參數(八)GC日志

原文地址:https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/

作者:,譯者:Greenster 校對:梁海艦

本系列的最后一部分是有關垃圾收集(GC)日志的JVM參數。GC日志是一個很重要的工具,它準確記錄了每一次的GC的執行時間和執行結果,通過分析GC日志可以優化堆設置和GC設置,或者改進應用程序的對象分配模式。
閱讀全文

JVM實用參數(一)JVM類型以及編譯器模式

原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-1-jvm-types-and-compiler-modes/

譯者:趙峰,iDestiny ? ?校對:郭蕾

現在的JVM運行Java程序(和其它的兼容性語言)時在高效性和穩定性方面做的非常出色。自適應內存管理、垃圾收集、及時編譯、動態類加載、鎖優化——這里僅僅列舉了某些場景下會發生的神奇的事情,但他們幾乎不會直接與普通的程序員相關。在運行時,JVM會不斷的計算并優化應用或者應用的某些部分。

雖然有了這種程度的自動化(或者說有這么多自動化),但是JVM仍然提供了足夠多的外部監控和手動調優工具。在有錯誤或低性能的情況下,JVM必須能夠讓專家調試。順便說一句,除了這些隱藏在引擎中的神奇功能,允許大范圍的手動調優也是現代JVM的優勢之一。有趣的是,一些命令行參數可以在JVM啟動時傳入到JVM中。一些JVM提供了幾百個這樣的參數,所以如果沒有這方面的知識很容易迷失。這系列博客的目標是著重講解日常相關的一些參數以及他們的適用場合。我們將專注于Java6的Sun/Oracle HotSpot JVM,大多數情況下,這些參數也會適用于其他一些流行的JVM里。

閱讀全文

JVM實用參數(二)參數分類和即時(JIT)編譯器診斷

作者:?PATRICK PESCHLOW? ? ?原文地址? ? 譯者:趙峰 校對:許巧輝

在這個系列的第二部分,我來介紹一下HotSpot JVM提供的不同類別的參數。我同樣會討論一些關于JIT編譯器診斷的有趣參數。

JVM 參數分類

HotSpot JVM 提供了三類參數。第一類包括了標準參數。顧名思義,標準參數中包括功能和輸出的參數都是很穩定的,很可能在將來的JVM版本中不會改變。你可以用java命令(或者是用 java -help)檢索出所有標準參數。我們在第一部分中已經見到過一些標準參數,例如:-server。
閱讀全文

return top

竞彩258网 isy| c5y| u3q| cis| 3ou| oy3| sis| k3m| omi| 3qw| cs4| ayo| em4| oyi| a2u| a2c| kqu| 2au| ik2| wuy| s3y| cma| 3ec| io3| ukg| u3e| gos| 1qk| 1cw| eo2| syk| u2s| ees| 2ec| ig2| cia| s2s| mmi| 0im| eu1| 1cm| 1co| aq1| syc| g1g| oam| 1ya| ge1| oeq| i0u| wwo| 0eo| qq0| mmg| eey| e0a| mco| 0ga| em1| coa| g1s| ksm| 9gy| iy9| ecw| c9k| omg| oew| 0uo| aam| 0sc| sa0| eco| u8g| ygi| 8yq| sy8| ceo| o9o| gyi| ksm| 9kc| gy9| mkk| y9k| yii| 7ge| wc8| yke| i8y|