java事
1. java 對象頭那點事
對象填充在Java中為何存在?欄位內存對齊的主要目的之一是確保所有欄位都位於同一緩存行內,以避免跨緩存行的欄位訪問。這種跨行訪問可能導致讀取和存儲操作頻繁替換緩存行,從而降低程序執行效率。填充對象的主要目的是優化內存訪問,提高程序執行速度。
對象頭中的mark word包含多個重要信息,這些信息有助於理解對象的狀態。在OpenJDK(JDK8)中,mark word結構如下:
32位:哈希值(25位)| 年齡(4位)| 偏向鎖標志(1位)| 鎖標志(2位)| Java線程指針(23位)| 代(2位)
64位:未使用位(25位)| 哈希值(31位)| 未使用位(1位)| 年齡(4位)| 偏向鎖標志(1位)| 鎖標志(2位)| Java線程指針(54位)| 代(2位)
不同鎖狀態由特定的數值表示:鎖定狀態(重量級監視器)表示為0;解鎖狀態表示為1;偏向鎖狀態表示為2;標記狀態表示為3。
年齡位和代位用於跟蹤對象狀態和生命周期,包括年齡、偏向鎖、鎖狀態和對象所處的內存區域。
epoch值是一個時間戳,用於表示偏向鎖的有效性。每當對象進行批量重偏向操作時,epoch值會增加。此操作隻影響持有該類實例的線程。當線程嘗試獲取偏向鎖時,會檢查epoch值以確定鎖是否仍然有效。
oopDesc類中的mark屬性用於存儲對象頭信息,包括指向方法區的instanceKlass實例的class pointer(元數據指針)和表示數組長度的欄位。數組對象具有額外的length欄位。
對象頭和markword的細節對於理解Java內存模型和垃圾回收過程至關重要。面試時,如果被問及對象為何能作為鎖使用,可以結合上述對象頭和markword的相關知識進行解答。對象頭中的markword提供了對象狀態的信息,這在多線程和並發編程中至關重要,有助於管理內存分配和回收,以及鎖的實現和優化。
2. java可以做什麼事情
1.安卓程序
如果你想看看Java程序是在哪裡使用到的,也不難。打開安卓手機,點開任何一個程序他們其實都是使用Java語言編寫,通過調用谷歌的安卓API(類似之前的JDK,但是安卓為開發人員提供了更多的特性)來實現的。順便說一下,安卓程序使用不同的JVM,打包方式也不一樣。但是確實是Java語言編寫的。
2.金融服務業伺服器端應用
在金融服務業Java應用非常多。很多投行,像高盛,花旗,巴克萊,渣打銀行都使用Java來編寫前後端交易軟體,結算和確認系統,數據處理系統等等。Java程序大多都用於編寫服務端程序,沒有前端,處理數據交互。之前Java Swing對於創建大型交易程序的前端很在行,但是現在C#的市場份額快速增長,JavaSwing風頭不再。
3.Java網頁程序
Java在電子商務網站應用上也是重頭戲。有很多應用是由Spring MVC,Struts 2.0或者類似的框架搭建起來的。各種政府的項目中,各種簡單的基於Servlet,JSP,或者Struts的網站應用也很流行。很多政府網站,健康機構,保險,教育,安全等領域的網站都是Java編寫的。
4.軟體工具
很多好用的開發工具是由Java編寫的。比如Eclipse,InetelliJ Ide和Netbeans IDE.我認為這幾個是最常用的基於Java的桌面程序。盡管Swing一度在金融行業和投資銀行寫客戶端很流行,但是如今Java FX越來越流行,盡管還不能完全替代Swing。C#目前幾乎將金融行業的Swing應用全部代替了。
5.交易應用
第三方交易系統,也是金融服務行業的一大組成部分,也是用Java.比較流行的像銀行間互聯的軟體Murex這種應用也是用Java編寫的。
6.J2ME應用
盡管iOS和安卓差點將J2ME市場滅掉,在諾基亞和三星手持設備中J2ME依然有很多應用。曾經一度安卓上幾乎所有的程序都是由MIDP和CLDC寫的,這兩者是J2ME平台的一部分。J2ME現在仍然流行於藍光碟,卡應用,機頂盒等。WhatsApp之所以流行的原因之一也是它在諾基亞上用J2ME也開發了一個版本。這個版本也有很多人在使用。
7. 嵌入式領域
嵌入式領域Java也有很多使用。這展現了這個平台的兼容性。你只需要130K的空間就可以使用Java技術了。最開始Java就是為嵌入式設備設計的。事實上,這個領域正像Java設計初衷「一處編譯,多處運行」一樣,嵌入式這塊正在不斷發展。
8.大數據技術
Hadoop還有其他大數據技術都是使用了Java。例如Apache的基於Java的HBase和Accumulo項目,ElasticSearch也是。盡管Java不是這個領域的領先者,因為有像使用C++編寫的MongoDB這種項目在。但是如果hadoop和ElasticSearch越來越強大,Java在這個領域也會越走越遠。
9.高頻交易領域
Java平台已經很大的提升了性能,通過使用JITs技術,他的傳遞效率可以和C++媲美。這是這個原因,Java被用在了很多高頻交易領域。盡管速度和其他語言略微遜色,但是相對C++它可以提供高效,安全的使用。
10.科研領域
如今科研領域基本上默認使用Java,包括自然語言處理。因為Java語言比C++和其他語言更加安全高效。