java開發屬于后端嗎,值得一讀!

1. 垃圾回收機制

Stop-the-World:
  JVM由于要執行GC而停止了應用程序的執行稱之為Stop-the-World,該情形會在任何一種GC算法中發生。當Stop-the-world發生時,除了GC所需的線程以外,所有線程都處于等待狀態直到GC任務完成。事實上,GC優化很多時候就是指減少Stop-the-world發生的時間,從而使系統具有 高吞吐 、低停頓 的特點。

2. java運行時的內存劃分

1. 程序計數器
記錄當前線程所執行的字節碼行號,用于獲取下一條執行的字節碼。
當多線程運行時,每個線程切換后需要知道上一次所運行的狀態、位置。

由此也可以看出程序計數器是每個線程私有的。

3. 虛擬機棧
虛擬機棧由一個一個的棧幀組成,棧幀是在每一個方法調用時產生的。
每一個棧幀由局部變量區、操作數棧等組成。每創建一個棧幀壓棧,當一個方法執行完畢之后則出棧。

  • 如果出現方法遞歸調用出現死循環的話就會造成棧幀過多,最終會拋出 StackOverflowError。
  • 若線程執行過程中棧幀大小超出虛擬機棧限制,則會拋出 StackOverflowError。
  • 若虛擬機棧允許動態擴展,但在嘗試擴展時內存不足,或者在為一個新線程初始化新的虛擬機棧時申請不到足夠的內存,則會拋出 OutOfMemoryError。

這塊內存區域也是線程私有的。

4. Java堆
Java 堆是整個虛擬機所管理的最大內存區域,所有的對象創建都是在這個區域進行內存分配。

可利用參數 -Xms -Xmx 進行堆內存控制。

這塊區域也是垃圾回收器重點管理的區域,由于大多數垃圾回收器都采用分代回收算法,所有堆內存也分為 新生代、老年代,可以方便垃圾的準確回收。

這塊內存屬于線程共享區域。

5. 方法區
方法區主要用于存放已經被虛擬機加載的類信息,如常量,靜態變量。 這塊區域也被稱為永久代。

可利用參數 -XX:PermSize -XX:MaxPermSize 控制初始化方法區和最大方法區大小。
6. 元數據區
在 JDK1.8 中已經移除了方法區(永久代),并使用了一個元數據區域進行代替(Metaspace)。
默認情況下元數據區域會根據使用情況動態調整,避免了在 1.7 中由于加載類過多從而出現 java.lang.OutOfMemoryError: PermGen。
但也不能無線擴展,因此可以使用 -XX:MaxMetaspaceSize來控制最大內存。
7. 運行時常量池
運行時常量池是方法區的一部分,其中存放了一些符號引用。當 new 一個對象時,會檢查這個區域是否有這個符號的引用。
8. 直接內存
直接內存又稱為 Direct Memory(堆外內存),它并不是由 JVM 虛擬機所管理的一塊內存區域。

有使用過 Netty 的朋友應該對這塊并內存不陌生,在 Netty 中所有的 IO(nio) 操作都會通過 Native 函數直接分配堆外內存。

它是通過在堆內存中的 DirectByteBuffer 對象操作的堆外內存,避免了堆內存和堆外內存來回復制交換復制,這樣的高效操作也稱為零拷貝。

既然是內存,那也得是可以被回收的。但由于堆外內存不直接受 JVM 管理,所以常規 GC 操作并不能回收堆外內存。它是借助于老年代產生的 fullGC 順便進行回收。同時也可以顯式調用 System.gc() 方法進行回收(前提是沒有使用 -XX:+DisableExplicitGC 參數來禁止該方法)。

值得注意的是:由于堆外內存也是內存,是由操作系統管理。如果應用有使用堆外內存則需要平衡虛擬機的堆內存和堆外內存的使用占比。避免出現堆外內存溢出。
9. 常用參數

通過上圖可以直觀的查看各個區域的參數設置。

常見的如下:

  • -Xms64m 最小堆內存 64m.

  • -Xmx128m 最大堆內存 128m.

  • -XX:NewSize=30m 新生代初始化大小為30m.

  • -XX:MaxNewSize=40m 新生代最大大小為40m.

  • -Xss=256k 線程棧大小。

  • -XX:+PrintHeapAtGC 當發生 GC 時打印內存布局。

  • -XX:+HeapDumpOnOutOfMemoryError 發送內存溢出時 dump 內存。

新生代和老年代的默認比例為 1:2,也就是說新生代占用 1/3的堆內存,而老年代占用 2/3 的堆內存。

可以通過參數 -XX:NewRatio=2 來設置老年代/新生代的比例。

對象的創建

下圖便是 Java 對象的創建過程,我建議最好是能默寫出來,并且要掌握每一步在做什么。

Step1:類加載檢查

虛擬機遇到一條 new 指令時,首先將去檢查這個指令的參數是否能在常量池中定位到這個類的符號引用,并且檢查這個符號引用代表的類是否已被加載過、解析和初始化過。如果沒有,那必須先執行相應的類加載過程。

Step2:分配內存

在類加載檢查通過后,接下來虛擬機將為新生對象分配內存。對象所需的內存大小在類加載完成后便可確定,為對象分配空間的任務等同于把一塊確定大小的內存從 Java 堆中劃分出來。分配方式有 “指針碰撞” 和 “空閑列表” 兩種,選擇那種分配方式由 Java 堆是否規整決定,而 Java 堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。

內存分配的兩種方式:(補充內容,需要掌握)

選擇以上兩種方式中的哪一種,取決于 Java 堆內存是否規整。而 Java 堆內存是否規整,取決于 GC 收集器的算法是"標記-清除",還是"標記-整理"(也稱作"標記-壓縮"),值得注意的是,復制算法內存也是規整的

內存分配并發問題(補充內容,需要掌握)

在創建對象的時候有一個很重要的問題,就是線程安全,因為在實際開發過程中,創建對象是很頻繁的事情,作為虛擬機來說,必須要保證線程是安全的,通常來講,虛擬機采用兩種方式來保證線程安全:

  • CAS+失敗重試: CAS 是樂觀鎖的一種實現方式。所謂樂觀鎖就是,每次不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。虛擬機采用 CAS 配上失敗重試的方式保證更新操作的原子性。

  • TLAB: 為每一個線程預先在 Eden 區分配一塊兒內存,JVM 在給線程中的對象分配內存時,首先在 TLAB 分配,當對象大于 TLAB 中的剩余內存或 TLAB 的內存已用盡時,再采用上述的 CAS 進行內存分配

Step3:初始化零值

內存分配完成后,虛擬機需要將分配到的內存空間都初始化為零值(不包括對象頭),這一步操作保證了對象的實例字段在 Java 代碼中可以不賦初始值就直接使用,程序能訪問到這些字段的數據類型所對應的零值。

Step4:設置對象頭

初始化零值完成之后,虛擬機要對對象進行必要的設置,例如這個對象是那個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的 GC 分代年齡等信息。 這些信息存放在對象頭中。 另外,根據虛擬機當前運行狀態的不同,如是否啟用偏向鎖等,對象頭會有不同的設置方式。

最后

由于篇幅限制,小編在此截出幾張知識講解的圖解,有需要的程序猿(媛)可以點贊后戳這里免費領取全部資料獲取哦

P8級大佬整理在Github上45K+star手冊,吃透消化,面試跳槽不心慌

P8級大佬整理在Github上45K+star手冊,吃透消化,面試跳槽不心慌

P8級大佬整理在Github上45K+star手冊,吃透消化,面試跳槽不心慌

P8級大佬整理在Github上45K+star手冊,吃透消化,面試跳槽不心慌

P8級大佬整理在Github上45K+star手冊,吃透消化,面試跳槽不心慌

]

[外鏈圖片轉存中…(img-NwBVpf9x-1624947332610)]

[外鏈圖片轉存中…(img-x4bm9OkU-1624947332611)]

[外鏈圖片轉存中…(img-MZ1rc7F6-1624947332612)]

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

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

相關文章

linux 創建精靈進程,linux 進程通信之 守護進程

守護進程(Daemon)Daemon(精靈)進程,是linux中的后臺服務進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的時間。一般采用以d結尾的名字。從下面的進程信息可以看出,守護進程都是【?】。colord 1160 0.0 0.2 …

java開發崗位招聘,吊打面試官

一.java基礎面試知識點 java中和equals和hashCode的區別 int、char、long各占多少字節數 int與integer的區別 探探對java多態的理解 String、StringBuffer、StringBuilder區別 什么是內部類?內部類的作用 抽象類和接口區別 抽象類的意義 抽象類與接口的應用…

linux 調用默認程序打開文件,Excel VBA如何使用默認應用程序打開文件

我無法評論現有答案(分數不足),因此我在回答以添加信息。從Access 2010開始,我遇到了以下語法的無提示故障:Dim URL As StringURL "http://foo.com/"CreateObject("Shell.Application").Open URL如果用URL括號括起來&am…

java開發工作找不到要放棄嗎,年薪50W

1. Redis面試專題 絕大部分寫業務的程序員,在實際開發中使用 Redis 的時候,只會 Set Value 和 Get Value 兩個操作,對 Redis 整體缺乏一個認知。這里以面試題的形式對 Redis 常見問題做一個總結,解決大家的知識盲點。 什么是Red…

linux 函數手冊 在線,Linux系統API函數手冊

Linux系統API函數手冊 (34頁)本資源提供全文預覽,點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧,查找使用更方便哦!11.90 積分(一)文件操作篇 1、creat(建立文件)頭文件1 #include2 #include3 #include定義函數1 int creat(const char * pa…

java開發工具包的英文縮寫,程序員翻身之路

基本概念面試題集( Spring 相關概念梳理) 談談對Spring loC的理解?談談對Spring Dl的理解?BeanFactory 接口和ApplicationContext接口不同點是什么?請介紹你熟悉的Spring 核心類,并說明有什么作用?介紹一下Spring的事務的了解?介紹—下…

linux 磁盤管理3板斧,Linux磁盤管理三板斧的使用心得

磁盤是Linux系統中一項非常重要的資源,如何對其進行有效的管理直接關系到整個系統的性能問題。對Linux磁盤管理稍微有一 些學習和經驗的朋友們應該都知道df、du和fdisk這三個常用命令:df用于檢查文件系統磁盤占用情況,du檢查磁盤空間占用情況…

java開發工程師學什么專業,Java核心知識點

應聘求職 每年這個時候,都是應屆生求職以及在職人員跳槽的高峰期。對于即將成為程序員的應屆畢業生們。在求職過程中怎樣確定目標公司和目標職位,大家在求職過程中要注意哪些細節?這些都是大家所關心的話題。 ①應聘渠道: ⑴學校招聘會&a…

linux查看服務器電源風扇,nagios監控vsphere ESXi主機硬件狀態(CPU風扇、電源模塊、硬盤、溫度)...

nagios監控vsphere ESXi主機硬件狀態(CPU風扇、電源模塊、硬盤、溫度)esxi 的只讀賬戶和密碼(本文以chkhardware/chkreadonly為例)插架下載地址,此地址附有相關說明:http://www.claudiokuenzler.com/nagios-plugins/check_esxi_hardware.phpESXI主機:DELL R410ESXI版本:ESXI4.0…

java開發工程師招聘軟件,面試題附答案

螞蟻金服一面(技術面) JVM 內存分哪幾個區,每個區的作用是什么?JVM有哪些回收算法,對應的收集器有哪些? GC 的兩種判定方法 ?CMS 收集器與 G1 收集器的特點。 hashmap源碼問題 HashMap、HashMap如何保…

java高分面試指南:redis怎么保證高可用

緩存雪崩 緩存雪崩指的是Redis當中的大量緩存在同一時間全部失效,而假如恰巧這一段時間同時又有大量請求被發起,那么就會造成請求直接訪問到數據庫,可能會把數據庫沖垮。 緩存雪崩一般形容的是緩存中沒有而數據庫中有的數據,而因…

linux文件系統只有幾k,關于Linux文件系統的的簡單理解和認識

關于Linux文件系統的的簡單理解和認識關于文件系統的運作,這與操作系統帶的檔案數據有關。例如Linux操作系統的檔案權限(rwx)與文件屬性(擁有者,群組,時間參數等)。文件系統通常會將這兩部分的數據分別存放在不同的區塊,權限與屬性…

Java高級工程師必備知識!java入門書籍pdf

美團技術一面20分鐘 晚7點,因為想到下周一才面試,我剛準備出去打個羽毛球,北京的電話就來了。面試官各種抱歉,說開會拖延了。 1、自我介紹 說了很多遍了,很流暢撿重點介紹完。 2、問我數據結構算法好不好 挺好的&…

機器人足球比賽linux,機器人足球實驗報告.doc

機器人足球實驗報告.doc實驗一一、實驗目的掌握RoboCup仿真機器人足球比賽相關知識點,具體內容如下:Linux操作系統的熟悉及了解其基本操作。掌握Linux下如何進行C編程,了解gcc編譯器以及一些簡單編輯工具,如:vi、emacs…

linux eclipse設置顏色,Linux Eclipse美化:解決工具欄過大和 Javadoc背景色修改

Eclipse 在Ubuntu 下總是感覺上面的工具欄感覺特別的大,控件之間的空隙非常的大,和在Windows 下的感覺非常的不一樣(畢竟是剛剛從windows叛逃出來),其實也不光光是Eclipse 是這樣,其他也軟件也同樣有這個問題。嘗試過通過更換主題…

Java高級工程師面試實戰,mysqlsettimeout

我聽到的一些發聲 你們賺的錢已經可以了: 我一個發小是做土木工程的,上海大學博士,參與很多著名建筑的工程,但是從薪資上看,還不如一些稍微像樣的公司的6年多的高級開發。為什么?這就是行業的紅利&#xf…

manjaro linux 關機,給本子安裝manjaro 出現無法關機的解決辦法

manjaro-kde-17.1.8-stable 和* win10* 雙系統 總是發現在關機或者重啟的時候,出現莫名凍屏的情況,只能按電腦的電源按鈕才可以強行關掉,(在進行解決的時候強行關機了 好多次!!。。心疼啊!!) 最…

Java高級開發面試,java字符串拼接的方法

一面:70分鐘 突擊電話面試 正思考著項目功能模塊,阿里面試官打來了電話,開始了阿里一面。 阿里面試官自我介紹,介紹了5分鐘左右,部門的情況,主要的業務 提問開始 會哪些操作系統 Linux會一點說一下操作指…

linux下安裝nginx1.10,Linux(RHEL7.0)下安裝nginx-1.10.2(示例代碼)

查看當前系統版本是否支持當前,nginx發布包支持以下Linux操作系統版本:RHEL/CentOS:VersionSupported Platforms5.xx86_64, i3866.xx86_64, i3867.xx86_64, ppc64leDebian:VersionCodenameSupported Platforms7.xwheezyx86_64, i3868.xjessiex86_64, i386Ubuntu:Ver…

Java高級開發面試,java泛型下界通配符

微服務是什么 微服務起源于2005年Peter Rodgers博士在云端運算博覽會提出的微Web服務(Micro-Web-Service),根本思想類似于Unix的管道設計理念。2014年,由Martin Fowler 與 James Lewis共同提出了微服務的概念,定義了微服務架構風格是一種通過…