主頁 > 後端開發 > 這是一份穩收秋招offer的jvm常見面試題指南,助你成為offer收割機

這是一份穩收秋招offer的jvm常見面試題指南,助你成為offer收割機

2020-09-21 16:20:48 後端開發

JVM是java從業者,必須要邁過的坎,不管你是初級、中級還是高級,都是必須掌握的,而且在面試中,jvm也是必考題,如果你不深入了解話,那去面試找作業肯定是有點難受的,

本文將重點介紹面試程序中常見的 JVM 題目,將面試題分為三大類:基礎題目,進階題目,實戰題目

基礎

1.1 JDK、 JRE、JVM 的關系是什么?

什么是 JVM ?

英文名稱 ( Java Virtual Machine ),就是 JAVA 虛擬機, 它只識別 .class 型別檔案,它能夠

將 class 檔案中的位元組碼指令進行識別并呼叫作業系統向上的 API 完成動作,

什么是 JRE ?

英文名稱( Java Runtime Environment ),Java 運行時環境,

它主要包含兩個部分:JVM 的標準實作和 Java 的一些基本類別庫,相對于 JVM 來說,JRE多出

來一部分 Java 類別庫,

什么是 JDK?

英文名稱( Java Development Kit ),Java 開發工具包,

JDK 是整個 Java 開發的核心,它集成了 JRE 和一些好用的小工具,

例如:javac.exe、java.exe、jar.exe 等,

這三者的關系:一層層的嵌套關系,JDK > JRE > JVM,

1.2 JVM 的記憶體模型以及磁區情況和作用

如下圖所示:

黃色部分為執行緒共有,藍色部分為執行緒私有,

方法區

用于存盤虛擬機加載的類資訊,常量,靜態變數等資料,

存放物件實體,所有的物件和陣列都要在堆上分配,

是 JVM 所管理的記憶體中最大的一塊區域,

堆疊

Java 方法執行的記憶體模型:存盤區域變數表,運算元堆疊,動態鏈接,方法出口等資訊,

生命周期與執行緒相同,

本地方法堆疊

作用與虛擬機堆疊類似,不同點本地方法堆疊為 native 方法執行服務,虛擬機堆疊為虛擬機執行的

Java 方法服務,

程式計數器

當前執行緒所執行的行號指示器,是 JVM 記憶體區域最小的一塊區域,執行位元組碼作業時就是利

用程式計數器來選取下一條需要執行的位元組碼指令,

1.3 JVM 物件創建步驟流程是什么?

整體流程如下圖所示:

第 1 步:虛擬機遇到一個 new 指令,首先將去檢查這個指令的引數是否能在常量池中定位到

這個類的符號參考, 并且檢查這個符號參考的類是否已經被加載&決議&初始化,

第 2 步:如果類已經被加載那么進行第 3 步; 如果沒有進行加載, 那么就就需要先進行類的加載,

第 3 步:類加載檢查通過之后, 接下來進行新生物件的記憶體分配,

第 4 步:物件生成需要的記憶體大小在類加載完成后便可完全確定,為物件分配空間等同于把一

塊確定大小的記憶體從 Java 堆中劃分出來

第 5 步:記憶體大小的劃分分為兩種情況:

第一種情況:JVM 的記憶體是規整的, 所有的使用的記憶體都放到一邊, 空閑的記憶體在另外一

邊, 中間放一個指標作為分界點的指示器, 那么這時候分配記憶體就比較簡單, 只要講指標向

空閑空間那邊挪動一段與物件大小相同的距離, 這種就是“指標碰撞”,

第二種情況:JVM 的記憶體不是規整的, 也就是說已使用的記憶體與未使用的記憶體相互交錯, 這

時候就沒辦法利用指正碰撞了, 這時候我們就需要維護一張表,用于記錄那些記憶體可用, 在

分配的時候從串列中找到一塊足夠大的空間劃分給物件實體, 并更新到記錄表上,

第 6 步:空間申請完成之后, JVM 需要將記憶體的空間都初始化為 0 值,

如果使用 TLAB, 就可以在 TLAB 分配的時候就可以進行該作業,

第 7 步: JVM 對物件進行必要的設定, 例如, 這個物件是哪個類的實體、物件的哈希碼、GC 年代等資訊,

第 8 步:完成了上面的步驟之后 從 JVM 來看一個物件基本上完成了, 但從 Java 程式代碼絕對來看, 物件創建才剛剛開始, 需要執行 方法, 按照程式中設定的初始化操作初始化, 這時候一個真正的程式物件生成了,

1.4 垃圾回收演算法有幾種型別? 他們對應的優缺點又是什么?

常見的垃圾回收演算法有:

標記-清除演算法

標記—清除演算法包括兩個階段:“標記”和“清除”,

標記階段:確定所有要回收的物件,并做標記,

清除階段:將標記階段確定不可用的物件清除,

缺點:

1.標記和清除的效率都不高,

2.會產生大量的碎片,而導致頻繁的回收,

復制演算法

記憶體分成大小相等的兩塊,每次使用其中一塊,當垃圾回收的時候, 把存活的物件復制到另

一塊上,然后把這塊記憶體整個清理掉,

缺點:

1.需要浪費額外的記憶體作為復制區,

2.當存活率較高時,復制演算法效率會下降,

標記-整理演算法

標記—整理演算法不是把存活物件復制到另一塊記憶體,而是把存活物件往記憶體的一端移動,然后

直接回收邊界以外的記憶體,

缺點: 演算法復雜度大,執行步驟較多.

分代收集演算法

目前大部分 JVM 的垃圾收集器采用的演算法,根據物件存活的生命周期將記憶體劃分為若干個不同的區域,

一般情況將堆區劃分為新生代( Young Generation 和老年代( Tenured Generation ),永久代( Permanet Generation ),

老年代的特點是每次垃圾收集時只有少量物件需要被回收,而新生代的特點是每次垃圾回收時

都有大量的物件需要被回收,那么就可以根據不同代的特點采取最適合的收集演算法,

如下圖所示:

Young:存放新創建的物件,物件生命周期非常短,幾乎用完可以立即回收,也叫 Eden 區,

Tenured: young 區多次回收后存活下來的物件將被移到 tenured 區,也叫 old 區,

Perm:永久帶,主要存加載的類資訊,生命周期長,幾乎不會被回收,

缺點: 演算法復雜度大,執行步驟較多,

1.5 簡單介紹一下什么是類加載機制?

Class 檔案由類裝載器裝載后,在 JVM 中將形成一份描述 Class 結構的元資訊物件,通過該

元資訊物件可以獲知 Class 的結構資訊:如建構式,屬性和方法等,

虛擬機把描述類的資料從 class 檔案加載到記憶體,并對資料進行校驗,轉換決議和初始化,最

終形成可以被虛擬機直接使用的 Java 型別,這就是虛擬機的類加載機制,

1.6 類的加載程序是什么?簡單描述一下每個步驟:

類加載的程序包括了:

第一步:加載

查找并加載類的二進制資料,

加載是類加載程序的第一個階段,虛擬機在這一階段需要完成以下三件事情:

  • ·通過類的全限定名來獲取其定義的二進制位元組流

  • 將位元組流所代表的靜態存盤結構轉化為方法區的運行時資料結構

  • 在 Java 堆中生成一個代表這個類的 java.lang.Class 物件,作為對方法區中這些資料的訪問入口

第二步:驗證

確保被加載的類的正確性,

這一階段是確保 Class 檔案的位元組流中包含的資訊符合當前虛擬機的規范,并且不會損害虛擬機自身的安全,

包含了四個驗證動作:檔案格式驗證,元資料驗證,位元組碼驗證,符號參考驗證

第三步:準備

為類的靜態變數分配記憶體,并將其初始化為默認值,

準備階段是正式為類變數分配記憶體并設定類變數初始值的階段,這些記憶體都將在方法區中分配,

第四步:決議

把類中的符號參考轉換為直接參考,

決議階段是虛擬機將常量池內的符號參考替換為直接參考的程序,決議動作主要針對類或接

口、欄位、類方法、介面方法、方法型別、方法句柄和呼叫點限定符 7 類符號參考進行,

第五步:初始化

類變數進行初始化

為類的靜態變數賦予正確的初始值,JVM 負責對類進行初始化,主要對類變數進行初始化,

1.7 JVM 預定義的類加載器有哪幾種?分別什么作用?

啟動(Bootstrap)類加載器、標準擴展(Extension)類加載器、應用程式類加載器(Application)

啟動(Bootstrap)類加載器

引導類裝入器是用本地代碼實作的類裝入器,它負責將 /lib 下面的類別庫加載到記憶體中,

由于引導類加載器涉及到虛擬機本地實作細節,開發者無法直接獲取到啟動類加載器的參考,

標準擴展(Extension)類加載器

擴展類加載器負責將 /lib/ext 或者由系統變數 java.ext.dir 指定位

置中的類別庫加載到記憶體中,開發者可以直接使用標準擴展類加載器,

應用程式類加載器(Application)

應用程式類加載器(Application ClassLoader):負責加載用戶路徑(classpath)上的類別庫,

1.8 什么是雙親委派模式?有什么作用?

基本定義:

雙親委派模型的作業流程是:如果一個類加載器收到了類加載的請求,它首先不會自己去加載

這個類,而是把請求委托給父加載器去完成,依次向上,因此,所有的類加載請求最終都應該

被傳遞到頂層的啟動類加載器中,只有當父加載器沒有找到所需的類時,子加載器才會嘗試去

加載該類,

雙親委派機制:

1.當 AppClassLoader 加載一個 class 時,它首先不會自己去嘗試加載這個類,而是把類加載

請求委派給父類加載器 ExtClassLoader 去完成,

2.當 ExtClassLoader 加載一個 class 時,它首先也不會自己去嘗試加載這個類,而是把類加

載請求委派給 BootStrapClassLoader 去完成,

3.如果 BootStrapClassLoader 加載失敗,會使用 ExtClassLoader 來嘗試加載;

4.若 ExtClassLoader 也加載失敗,則會使用 AppClassLoader 來加載,如果

AppClassLoader 也加載失敗,則會報出例外 ClassNotFoundException,

雙親委派作用:

· 通過帶有優先級的層級關可以避免類的重復加載;

· 保證 Java 程式安全穩定運行,Java 核心 API 定義型別不會被隨意替換,

1.9 介紹一下 JVM 中垃圾收集器有哪些? 他們特點分別是什么?

新生代垃圾收集器

Serial 收集器

特點: Serial 收集器只能使用一條執行緒進行垃圾收集作業,并且在進行垃圾收集的時候,所有

的作業執行緒都需要停止作業,等待垃圾收集執行緒完成以后,其他執行緒才可以繼續作業,

使用演算法:復制演算法.

ParNew 收集器

特點: ParNew 垃圾收集器是Serial收集器的多執行緒版本,為了利用 CPU 多核多執行緒的優勢,ParNew 收集器可以運

行多個收集執行緒來進行垃圾收集作業,這樣可以提高垃圾收集程序的效率,

使用演算法:復制演算法.

Parallel Scavenge 收集器

特點: Parallel Scavenge 收集器是一款多執行緒的垃圾收集器,但是它又和 ParNew 有很大的不同點,

Parallel Scavenge 收集器和其他收集器的關注點不同,其他收集器,比如 ParNew 和 CMS

這些收集器,它們主要關注的是如何縮短垃圾收集的時間,

而 Parallel Scavenge 收集器關注的是如何控制系統運行的吞吐量,這里說的吞吐量,指的是

CPU 用于運行應用程式的時間和 CPU 總時間的占比,吞吐量 = 代碼運行時間 / (代碼運行

時間 + 垃圾收集時間),如果虛擬機運行的總的 CPU 時間是 100 分鐘,而用于執行垃圾收
集的時間為 1 分鐘,那么吞吐量就是99%,

使用演算法:復制演算法

老年代垃圾收集器

Serial Old 收集器

特點: Serial Old 收集器是 Serial 收集器的老年代版本,

這款收集器主要用于客戶端應用程式中作為老年代的垃圾收集器,也可以作為服務端應用程式的垃圾收集器,

使用演算法:標記-整理

Parallel Old 收集器

特點: Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本這個收集器是在

JDK1.6 版本中出現的,所以在 JDK1.6 之前,新生代的 Parallel Scavenge 只能和 Serial Old

這款單執行緒的老年代收集器配合使用,Parallel Old 垃圾收集器和 Parallel Scavenge 收集器

一樣,也是一款關注吞吐量的垃圾收集器,和 Parallel Scavenge 收集器一起配合,可以實作

對 Java 堆記憶體的吞吐量優先的垃圾收集策略,

使用演算法:標記-整理

CMS 收集器

特點: CMS 收集器是目前老年代收集器中比較優秀的垃圾收集器,

CMS 是 Concurrent Mark Sweep,從名字可以看出,這是一款使用"標記-清除"演算法的并發收集器,

CMS 垃圾收集器是一款以獲取最短停頓時間為目標的收集器,

從圖中可以看出,CMS 收集器的作業程序可以分為 4 個階段:

  • ·初始標記(CMS initial mark)階段
  • 并發標記(CMS concurrent mark)階段
  • ·重新標記(CMS remark)階段
  • 并發清除((CMS concurrent sweep)階段

使用演算法:復制+標記清除

其他

G1 垃圾收集器

特點: 主要步驟:初始標記,并發標記,重新標記,復制清除

使用演算法:復制 + 標記整理

1.10 什么是 Class 檔案? Class 檔案主要的資訊結構有哪些?

Class 檔案是一組以 8 位位元組為基礎單位的二進制流,各個資料項嚴格按順序排列,

Class 檔案格式采用一種類似于 C 語言結構體的偽結構來存盤資料,

這樣的偽結構僅僅有兩種資料型別:無符號數和表

無符號數:是基本資料型別,以 u1、u2、u4、u8 分別代表 1 個位元組、2 個位元組、4 個字

節、8 個位元組的無符號數,能夠用來描寫敘述數字、索引參考、數量值或者依照 UTF-8 編碼

構成的字串值,

表:由多個無符號數或者其它表作為資料項構成的復合資料型別,全部表都習慣性地以 _info
結尾,

1.11 物件“物件已死” 是什么概念?

物件不可能再被任何途徑使用,稱為物件已死,

判斷物件已死的方法有:參考計數法與可達性分析演算法

進階

2.1 Java 語言怎么實作跨平臺的?

我們撰寫的 Java 原始碼,編譯后會生成一種 .class 檔案,稱為位元組碼檔案,

位元組碼不能直接運行,必須通過 JVM 翻譯成機器碼才能運行,

JVM 是一個”橋梁“,是一個”中間件“,是實作跨平臺的關鍵,Java 代碼首先被編譯成字

節碼檔案,再由 JVM 將位元組碼檔案翻譯成機器語言,從而達到運行 Java 程式的目的,

2.2 JVM 資料運行區,哪些會造成 OOM 的情況?

除了資料運行區,其他區域均有可能造成 OOM 的情況,

2.3 詳細介紹一下物件在分帶記憶體區域的分配程序?

JVM 會試圖為相關 Java 物件在 Eden 中初始化一塊記憶體區域,

當 Eden 空間足夠時,記憶體申請結束;否則到下一步,

JVM 試圖釋放在 Eden 中所有不活躍的物件(這屬于 1 或更高級的垃圾回收),釋放后若

Eden 空間仍然不足以放入新物件,則試圖將部分 Eden 中活躍物件放入 Survivor 區,

Survivor 區被用來作為 Eden 及 Old 的中間交換區域,當 Old 區空間足夠時,Survivor 區的

物件會被移到 Old 區,否則會被保留在 Survivor 區,

當 Old 區空間不夠時,JVM 會在 Old 區進行完全的垃圾收集,

完全垃圾收集后,若 Survivor 及 Old 區仍然無法存放從 Eden 復制過來的部分物件,導致

JVM 無法在 Eden 區為新物件創建記憶體區域,則出現 “ out of memory ” 錯誤,

1.4 G1 與 CMS 兩個垃圾收集器的對比

細節方面不同

1.G1 在壓縮空間方面有優勢,

2.G1 通過將記憶體空間分成區域(Region)的方式避免記憶體碎片問題,

3.Eden, Survivor, Old 區不再固定、在記憶體使用效率上來說更靈活,

4.G1 可以通過設定預期停頓時間(Pause Time)來控制垃圾收集時間避免應用雪崩現象,

5.G1 在回收記憶體后會馬上同時做合并空閑記憶體的作業、而 CMS 默認是在 STW(stop the world)的時候做,

6.G1 會在 Young GC 中使用、而 CMS 只能在 O 區使用,

整體內容不同:

CMS 的缺點是對 cpu 的要求比較高,

G1 是將記憶體化成了多塊,所有對內段的大小有很大的要求,

CMS 是清除,所以會存在很多的記憶體碎片,

G1 是整理,所以碎片空間較小,

2.5 線上常用的 JVM 引數有哪些?

資料區設定

· Xms:初始堆大小

· Xmx:最大堆大小

· Xss:Java 每個執行緒的Stack大小

· XX:NewSize=n:設定年輕代大小

· XX:NewRatio=n:設定年輕代和年老代的比值,

如:為 3,表示年輕代與年老代比值為 1:3,年輕代占整個年輕代年老代和的 1/4,

· XX:SurvivorRatio=n:年輕代中 Eden 區與兩個 Survivor 區的比值,

注意 Survivor 區有兩個,

如:3,表示 Eden:Survivor=3:2,一個 Survivor 區占整個年輕代的 1/5,

· XX:MaxPermSize=n:設定持久代大小,

收集器設定

  • · XX:+UseSerialGC:設定串行收集器

  • · XX:+UseParallelGC::設定并行收集器

  • · XX:+UseParalledlOldGC:設定并行年老代收集器

  • · XX:+UseConcMarkSweepGC:設定并發收集器

GC日志列印設定

  • · XX:+PrintGC:列印 GC 的簡要資訊

  • · XX:+PrintGCDetails:列印 GC 詳細資訊

  • · XX:+PrintGCTimeStamps:輸出 GC 的時間戳

2.6 物件什么時候進入老年代?

物件優先在 Eden 區分配記憶體

當物件首次創建時, 會放在新生代的 eden 區, 若沒有 GC 的介入,會一直在 eden 區,GC

后,是可能進入 survivor 區或者年老代

大物件直接進入老年代

所謂的大物件是指需要大量連續記憶體空間的 Java 物件,最典型的大物件就是那種很長的字符

串以及陣列,大物件對虛擬機的記憶體分配就是壞訊息,尤其是一些朝生夕滅的短命大物件,寫

程式時應避免,

長期存活的物件進入老年代

虛擬機給每個物件定義了一個物件年齡(Age)計數器,物件在 Survivor 區中每熬過一次

Minor GC,年齡就增加 1,當他的年齡增加到一定程度(默認是 15 歲), 就將會被晉升到

老年代中,

2.7 什么是記憶體溢位, 記憶體泄露? 他們的區別是什么?

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;

記憶體泄露 memory leak,是指程式在申請記憶體后,無法釋放已申請的記憶體空間,一次記憶體泄

露危害可以忽略,但記憶體泄露堆積后果很嚴重,無論多少記憶體,遲早會被占光,

記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,于是產生溢位,

記憶體泄漏是指你向系統申請分配記憶體進行使用(new),可是使用完了以后卻不歸還(delete),結果你申請到的那塊

記憶體你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程式,

2.8 引起類加載操作的行為有哪些?

1.遇到 new、getstatic、putstatic 或 invokestatic 這四條位元組碼指令,

2.反射呼叫的時候,如果類沒有進行過初始化,則需要先觸發其初始化,

3.子類初始化的時候,如果其父類還沒初始化,則需先觸發其父類的初始化,

4.虛擬機執行主類的時候(有 main( string[] args)),

5.JDK1.7 動態語言支持,

2.9 介紹一下 JVM 提供的常用工具

1.jps:用來顯示本地的 Java 行程,可以查看本地運行著幾個 Java 程式,并顯示他們的行程

號,

** 命令格式:jps.**

2.jinfo:運行環境引數:Java System 屬性和 JVM 命令列引數,Java class path 等資訊,

命令格式:jinfo 行程 pid.

3.jstat:監視虛擬機各種運行狀態資訊的命令列工具,

** 命令格式:jstat -gc 123 250 20**

4.jstack:可以觀察到 JVM 中當前所有執行緒的運行情況和執行緒當前狀態,

命令格式:jstack 行程 pid.

5.jmap:觀察運行中的 JVM 物理記憶體的占用情況(如:產生哪些物件,及其數量),

** 命令格式:jmap [option] pid.**

2.10 Full GC 、 Major GC 、Minor GC 之間區別?

Minor GC: 從新生代空間(包括 Eden 和 Survivor 區域)回收記憶體被稱為 Minor GC,

Major GC: 清理 Tenured 區,用于回收老年代,出現 Major GC 通常會出現至少一次 Minor GC,

Full GC: Full GC 是針對整個新生代、老年代、元空間(metaspace,java8 以上版本取代

perm gen)的全域范圍的 GC,

2.11 什么時候觸發 Full GC ?

  1. 呼叫 System.gc 時,系統建議執行 Full GC,但是不必然執行,

  2. 老年代空間不足,

  3. 方法區空間不足,

  4. 通過 Minor GC 后進入老年代的平均大小大于老年代的可用記憶體,

  5. 由 Eden 區、survivor space1(From Space)區向 survivor space2(To Space)區復制時,物件大小大于 To

Space 可用記憶體,則把該物件轉存到老年代,且老年代的可用記憶體小于該物件大小,

6. 2.12 什么情況下會出現堆疊溢位

1.方法創建了一個很大的物件,如 List,Array,

2.是否產生了回圈呼叫、死回圈,

3.是否參考了較大的全域變數,

2.13 說一下強參考、軟參考、弱參考、虛參考以及他們之間和 gc 的關系

1.強參考:new 出的物件之類的參考,只要強參考還在,永遠不會回收,

2.軟參考:參考但非必須的物件,記憶體溢位例外之前,回收,

3.弱參考:非必須的物件,物件能生存到下一次垃圾收集發生之前,

4.虛參考:對生存時間無影響,在垃圾回收時得到通知,

2.14 Eden 和 Survivor 的比例分配是什么情況?為什么?

默認比例 8:1, 大部分物件都是朝生夕死,

復制演算法的基本思想就是將記憶體分為兩塊,每次只用其中一塊,當這一塊記憶體用完,就將還活

著的物件復制到另外一塊上面,復制演算法不會產生記憶體碎片,

實戰

3.1 CPU 資源占用過高

1.top 查看當前 CPU 情況,找到占用 CPU 過高的行程 PID=123,

2.top -H -p123 找出兩個 CPU 占用較高的執行緒,記錄下來 PID=2345, 3456 轉換為十六進制,

3.jstack -l 123 > temp.txt 列印出當前行程的執行緒堆疊,

4.查找到對應于第二步的兩個執行緒運行堆疊,分析代碼,

3.2 OOM 例外排查

1.使用 top 指令查詢服務器系統狀態,

2.ps -aux|grep java 找出當前 Java 行程的 PID,

3.jstat -gcutil pid interval 查看當前 GC 的狀態,

4.jmap -histo:live pid 可用統計存活物件的分布情況,從高到低查看占據記憶體最多的物件,

5.jmap -dump:format=b,file= 檔案名 [pid] 利用 Jmap dump,

6.使用性能分析工具對上一步 dump 出來的檔案進行分析,工具有 MAT 等,

上面介紹了 JVM 常見的面試題目,希望對大家接下來的面試或者對于 JVM 的深入學習有所幫助,

除了上面的jvm知識點,還準備了一些必問面試題,收集了各方面的,當前公司的,還有自己收集總結的,下面的圖片截取的有pdf,有如果有需要的自取.

各大公司面試題集合:

簡歷模板:

鏈接: https://pan.baidu.com/s/1DO6XGkbmak7KIt6Y7JQqyw
提取碼:fgj6
不知道會不會失效,如果失效點擊(778490892)或者掃描下面二維碼,進群獲取,鏈接補發不過來,謝謝,

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98196.html

標籤:Java

上一篇:activiti入門

下一篇:MySQL索引結構原理分析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more