原文連接:https://mp.weixin.qq.com/s/KnSUprd6Z7zbpZAVR1OEdwhtml
1. JDK 和 JRE 有什麼區別?java
JDK(Java Development Kit) 是 Java 語言的軟件開發工具包。JDK包含JRE。mysql
JRE是Java Runtime Environment縮寫,指Java運行環境。運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。redis
2. == 和 equals 的區別是什麼?算法
== 在比較基本數據類型的時候,比較的是值是否相等;在比較兩個引用數據類型的對象的時候,比較的是其內存地址是否相等。spring
3. 兩個對象的 hashCode() 相同,則 equals() 也必定爲 true,對嗎?sql
不必定,若是你重寫了equals()方法,在hashCode()相同的時候,equals()能夠不爲true。數據庫
4. final 在 java 中有什麼做用?小程序
final修飾類,該類沒法被繼承;final修飾變量,該變量沒法被修改;final修飾方法,該方法沒法被重寫。設計模式
5. java 中的 Math.round(-1.5) 等於多少?
-1
6. String 屬於基礎的數據類型嗎?
不屬於,它是引用數據類型。
7. java 中操做字符串都有哪些類?它們之間有什麼區別?
StringBuilder ,StringBuffer兩個類的做用基本相同,StringBuffer的大多數方法都有synchronized關鍵字修飾,它是線程安全的。
8. String str="i"與 String str=new String("i")同樣嗎?
不同,String str="i" 直接指向常量池的「i」; String str=new String("i"),先在堆裏開闢內存空間,其地址再指向常量池的字符串。二者==返回false, 用equals()返回true.
9. 如何將字符串反轉?
StringBuilder方法直接反轉;
循環一遍,挨個字符添加到新的字符串裏,去反轉;
用頭尾兩個指針,不斷向中間移動,交換其字符串,直至相遇。
10. String 類的經常使用方法都有那些?
length();isEmpty();charAt(int index);getBytes();startsWith();endsWith();indexOf();lastIndexOf();substring();split();toLowerCase();toUpperCase();trim();toCharArray();intern();
11. 抽象類必需要有抽象方法嗎?
抽象類沒必要須有抽象方法。
12. 普通類和抽象類有哪些區別?
1.抽象類不能被實例化。
2.抽象類能夠有構造函數,被繼承時子類必須繼承父類一個構造方法,抽象方法不能被聲明爲靜態。
3.抽象方法只需申明,而無需實現,抽象類中能夠容許普通方法有主體
4.含有抽象方法的類必須申明爲抽象類
5.抽象的子類必須實現抽象類中全部抽象方法,不然這個子類也是抽象類。
13. 抽象類能使用 final 修飾嗎?
不能。一個類不能同時abstract和final.
14. 接口和抽象類有什麼區別?
(1)抽象類能夠有構造方法,接口中不能有構造方法。
(2)抽象類中能夠有普通成員變量,接口中沒有普通成員變量
(3)抽象類中能夠包含靜態方法,接口中不能包含靜態方法
(4) 一個類能夠實現多個接口,但只能繼承一個抽象類。
(5)接口能夠被多重實現,抽象類只能被單一繼承
(6)若是抽象類實現接口,則能夠把接口中方法映射到抽象類中做爲抽象方法而沒必要實現,而在抽象類的子類中實現接口中方法
15. java 中 IO 流分爲幾種?
16. BIO、NIO、AIO 有什麼區別?
IO的方式一般分爲幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
17. Files的經常使用方法都有哪些?
Files.exists() 檢測文件路徑是否存在
Files.createFile()建立文件
Files.createDirectory()建立文件夾
Files.delete() 刪除文件或者目錄
Files.copy() 複製文件
Files.move() 移動文件
Files.size()查看文件個數
Files.read() 讀取文件
Files.write()寫入文件
2. 容器
18. java 容器都有哪些?
Collection 和 Map 兩大接口。Collection下有List, Set, Queue.
19. Collection 和 Collections 有什麼區別?
Collection是接口,Collections是類。
20. List、Set、Map 之間的區別是什麼?
List中的元素,有序、可重複、可爲空;
Set中的元素,無序、不重複、只有一個空元素;
Map中的元素,無序、鍵不重,值可重、可一個空鍵、多可空值;
21. HashMap 和 Hashtable 有什麼區別?
HashMap線程不安全,沒有用sychronized關鍵字修飾,繼承AbstractMap類。
Hashtable線程安全,絕大多數方法用synchronized關鍵字修飾,繼承Dictionary類,
22. 如何決定使用 HashMap 仍是 TreeMap?
無序的鍵值對HashMap, 有序的鍵值對(天然順序或指定的comparator)TreeMap.
23. 說一下 HashMap 的實現原理?
https://baijiahao.baidu.com/s?id=1618550070727689060&wfr=spider&for=pc
24. 說一下 HashSet 的實現原理?
HashSet底層是一個HashMap, 都是調用的HashMap的方法實現的。
25. ArrayList 和 LinkedList 的區別是什麼?
ArrayList 數組實現,隨機訪問,查詢時間複雜度O(1) ,添加刪除操做最壞要移動整個數組,時間複雜度O(n);
LinkedList 是鏈表結構,還實現了Deque雙端隊列,查詢的時間複雜度可達O(n),添加刪除操做O(1).
26. 如何實現數組和 List 之間的轉換?
27. ArrayList 和 Vector 的區別是什麼?
Vector 多數方法有synchronized關鍵字修飾,是線程安全的。
28. Array 和 ArrayList 有何區別?
29. 在 Queue 中 poll()和 remove()有什麼區別?
1. queue的增長元素方法add和offer的區別在於,add方法在隊列滿的狀況下將選擇拋異常的方法來表示隊列已經滿了,而offer方法經過返回false表示隊列已經滿了;在有限隊列的狀況,使用offer方法優於add方法;
2. remove方法和poll方法都是刪除隊列的頭元素,remove方法在隊列爲空的狀況下將拋異常,而poll方法將返回null;
3. element和peek方法都是返回隊列的頭元素,可是不刪除頭元素,區別在與element方法在隊列爲空的狀況下,將拋異常,而peek方法將返回null.
30. 哪些集合類是線程安全的?
2、線程安全(Thread-safe)的集合對象:
3、非線程安全的集合對象:
31. 迭代器 Iterator 是什麼?
迭代器(Iterator)模式,又叫作遊標(Cursor)模式。GOF給出的定義爲:提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。
32. Iterator 怎麼使用?有什麼特色?
33. Iterator 和 ListIterator 有什麼區別?
咱們在使用List,Set的時候,爲了實現對其數據的遍歷,咱們常用到了Iterator(迭代器)。使用迭代器,你不須要干涉其遍歷的過程,只須要每次取出一個你想要的數據進行處理就能夠了。可是在使用的時候也是有不一樣的。List和Set都有iterator()來取得其迭代器。對List來講,你也能夠經過listIterator()取得其迭代器,兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在如下方面:
(1)ListIterator有add()方法,能夠向List中添加對象,而Iterator不能
(2)ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator就不能夠。
(3)ListIterator能夠定位當前的索引位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
(4)均可實現刪除對象,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iierator僅能遍歷,不能修改。
3. 多線程
35. 並行和併發有什麼區別?
36. 線程和進程的區別?
37. 守護線程是什麼?
若是 JVM 中沒有一個正在運行的非守護線程,這個時候,JVM 會退出。換句話說,守護線程擁有自動結束本身生命週期的特性,而非守護線程不具有這個特色。
JVM 中的垃圾回收線程就是典型的守護線程,若是說不具有該特性,會發生什麼呢?
當 JVM 要退出時,因爲垃圾回收線程還在運行着,致使程序沒法退出,這就很尷尬了!!!因而可知,守護線程的重要性了。
一般來講,守護線程常常被用來執行一些後臺任務,可是呢,你又但願在程序退出時,或者說 JVM 退出時,線程可以自動關閉,此時,守護線程是你的首選。
38. 建立線程有哪幾種方式?
1.繼承Thread類
2.實現runnable接口
3.實現callable接口
4.利用線程池建立。
39. 說一下 runnable 和 callable 有什麼區別?
不一樣點:
40. 線程有哪些狀態?
1. 新建(NEW):新建立了一個線程對象。
2. 可運行(RUNNABLE):線程對象建立後,其餘線程(好比main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取cpu 的使用權 。
3. 運行(RUNNING):可運行狀態(runnable)的線程得到了cpu 時間片(timeslice) ,執行程序代碼。
4. 阻塞(BLOCKED):阻塞狀態是指線程由於某種緣由放棄了cpu 使用權,也即讓出了cpu timeslice,暫時中止運行。直到線程進入可運行(runnable)狀態,纔有機會再次得到cpu timeslice 轉到運行(running)狀態。阻塞的狀況分三種:
(一). 等待阻塞:運行(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。
(二). 同步阻塞:運行(running)的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池(lock pool)中。
(三). 其餘阻塞:運行(running)的線程執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入可運行(runnable)狀態。
5. 死亡(DEAD):線程run()、main() 方法執行結束,或者因異常退出了run()方法,則該線程結束生命週期。死亡的線程不可再次復生。
41. sleep() 和 wait() 有什麼區別?
42. notify()和 notifyAll()有什麼區別?
一、這兩個方法來自不一樣的類分別是Thread和Object,sleep方法屬於Thread類中的靜態方法,wait屬於Object的成員方法。
二、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。
三、wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在任何地方使用(使用範圍)。
notify隨機喚醒一個,notifyAll喚醒全部在等待池中的線程去競爭鎖。
43. 線程的 run()和 start()有什麼區別?
線程經過start方法開啓一個線程,線程進入runnable狀態,主線程繼續往下走,線程如被CPU調度會調用run方法真正開始運行。
run方法只是runnable下面的一個普通方法,直接調用跟其餘方法無異。
44.建立線程池有哪幾種方式?
newSingleThreadExecutor
建立一個單線程的線程池。這個線程池只有一個線程在工做,也就是至關於單線程串行執行全部任務。若是這個惟一的線程由於異常結束,那麼會有一個新的線程來替代它。此線程池保證全部任務的執行順序按照任務的提交順序執行。
newFixedThreadPool
建立固定大小的線程池。每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,若是某個線程由於執行異常而結束,那麼線程池會補充一個新線程。
newCachedThreadPool
建立一個可緩存的線程池。若是線程池的大小超過了處理任務所須要的線程,
那麼就會回收部分空閒(60秒不執行任務)的線程,當任務數增長時,此線程池又能夠智能的添加新線程來處理任務。此線程池不會對線程池大小作限制,線程池大小徹底依賴於操做系統(或者說JVM)可以建立的最大線程大小。
newScheduledThreadPool
建立一個大小無限的線程池。此線程池支持定時以及週期性執行任務的需求。
45.線程池都有哪些狀態?
http://www.javashuo.com/article/p-mvmiktau-ey.html
46. 線程池中 submit()和 execute()方法有什麼區別?
submit()有返回Future, execute()沒有返回值。
47. 在 java 程序中怎麼保證多線程的運行安全?
1.原子性:提供互斥訪問,同一時刻只能有一個線程對數據進行操做,(atomic,synchronized);
2.可見性:一個線程對主內存的修改能夠及時地被其餘線程看到,(synchronized,volatile);
3.有序性:一個線程觀察其餘線程中的指令執行順序,因爲指令重排序,該觀察結果通常雜亂無序,(happens-before原則)。
48. 多線程鎖的升級原理是什麼?
49. 什麼是死鎖?
當線程互相持有對方所須要的資源時,會互相等待對方釋放資源,若是線程都不主動釋放所佔有的資源,將產生死鎖。
固然死鎖的產生是必需要知足一些特定條件的:
1.互斥條件:進程對於所分配到的資源具備排它性,即一個資源只能被一個進程佔用,直到被該進程釋放
2.請求和保持條件:一個進程因請求被佔用資源而發生阻塞時,對已得到的資源保持不放。
3.不剝奪條件:任何一個資源在沒被該進程釋放以前,任何其餘進程都沒法對他剝奪佔用
4.循環等待條件:當發生死鎖時,所等待的進程一定會造成一個環路(相似於死循環),形成永久阻塞。
50. 怎麼防止死鎖?
51. ThreadLocal 是什麼?有哪些使用場景?
http://www.javashuo.com/article/p-xvfvwsqg-cu.html
52. 說一下 synchronized 底層實現原理?
53. synchronized 和 volatile 的區別是什麼?
54. synchronized 和 Lock 有什麼區別?
1.首先synchronized是java內置關鍵字,在jvm層面,Lock是個java類;
2.synchronized沒法判斷是否獲取鎖的狀態,Lock能夠判斷是否獲取到鎖;
3.synchronized會自動釋放鎖(a 線程執行完同步代碼會釋放鎖 ;b 線程執行過程當中發生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),不然容易形成線程死鎖;
4.用synchronized關鍵字的兩個線程1和線程2,若是當前線程1得到鎖,線程2線程等待。若是線程1阻塞,線程2則會一直等待下去,而Lock鎖就不必定會等待下去,若是嘗試獲取不到鎖,線程能夠不用一直等待就結束了;
5.synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可中斷、可公平(二者皆可)
6.Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少許的同步問題。
55. synchronized 和 ReentrantLock 區別是什麼?
http://www.javashuo.com/article/p-qwrdvjnh-bv.html
56. 說一下 atomic 的原理?
4. 反射
57. 什麼是反射?
58. 什麼是 java 序列化?什麼狀況下須要序列化?
59. 動態代理是什麼?有哪些應用?
60. 怎麼實現動態代理?
JDK方式和CGlib方式
JDK動態代理:利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。
CGlib動態代理:利用ASM(開源的Java字節碼編輯庫,操做字節碼)開源包,將代理對象類的class文件加載進來,經過修改其字節碼生成子類來處理。
5. 對象拷貝
61. 爲何要使用克隆?
62. 如何實現對象克隆?
63. 深拷貝和淺拷貝區別是什麼?
若是要對某個類的的實例的引用類型屬性實現深克隆,要求引用類型屬性對於的類實現Cloneable接口並重寫clone()。
6. Java Web
64. jsp 和 servlet 有什麼區別?
65. jsp 有哪些內置對象?做用分別是什麼?
66. 說一下 jsp 的 4 種做用域?
67. session 和 cookie 有什麼區別?
68. 說一下 session 的工做原理?
69. 若是客戶端禁止 cookie 能實現 session 還能用嗎?
70. spring mvc 和 struts 的區別是什麼?
71. 如何避免 sql 注入?
72. 什麼是 XSS 攻擊,如何避免?
73. 什麼是 CSRF 攻擊,如何避免?
7. 異常
74. throw 和 throws 的區別?
75. final、finally、finalize 有什麼區別?
76. try-catch-finally 中哪一個部分能夠省略?
77. try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?
78. 常見的異常類有哪些?
8. 網絡
79. http 響應碼 301 和 302 表明的是什麼?有什麼區別?
301 Moved Permanently
302 Move Temporarily
80. forward 和 redirect 的區別?
81. 簡述 tcp 和 udp的區別?
82. tcp 爲何要三次握手,兩次不行嗎?爲何?
83. 說一下 tcp 粘包是怎麼產生的?
84. OSI 的七層模型都有哪些?
85. get 和 post 請求有哪些區別?
86. 如何實現跨域?
87. 說一下 JSONP 實現原理?
9. 設計模式
88. 說一下你熟悉的設計模式?
89. 簡單工廠和抽象工廠有什麼區別?
10. Spring/Spring MVC
90. 爲何要使用 spring?
91. 解釋一下什麼是 aop?
92. 解釋一下什麼是 ioc?
93. spring 有哪些主要模塊?
94. spring 經常使用的注入方式有哪些?
95. spring 中的 bean 是線程安全的嗎?
96. spring 支持幾種 bean 的做用域?
97. spring 自動裝配 bean 有哪些方式?
98. spring 事務實現方式有哪些?
99. 說一下 spring 的事務隔離?
100. 說一下 spring mvc 運行流程?
101. spring mvc 有哪些組件?
102. @RequestMapping 的做用是什麼?
103. @Autowired 的做用是什麼?
11. Spring Boot/Spring Cloud
104. 什麼是 spring boot?
105. 爲何要用 spring boot?
106. spring boot 核心配置文件是什麼?
107. spring boot 配置文件有哪幾種類型?它們有什麼區別?
108. spring boot 有哪些方式能夠實現熱部署?
109. jpa 和 hibernate 有什麼區別?
110. 什麼是 spring cloud?
111. spring cloud 斷路器的做用是什麼?
112. spring cloud 的核心組件有哪些?
12. Hibernate
113. 爲何要使用 hibernate?
114. 什麼是 ORM 框架?
115. hibernate 中如何在控制檯查看打印的 sql 語句?
116. hibernate 有幾種查詢方式?
117. hibernate 實體類能夠被定義爲 final 嗎?
118. 在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
119. hibernate 是如何工做的?
120. get()和 load()的區別?
121. 說一下 hibernate 的緩存機制?
122. hibernate 對象有哪些狀態?
123. 在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
124. hibernate 實體類必需要有無參構造函數嗎?爲何?
13. Mybatis
125. mybatis 中 #{}和 ${}的區別是什麼?
126. mybatis 有幾種分頁方式?
127. RowBounds 是一次性查詢所有結果嗎?爲何?
128. mybatis 邏輯分頁和物理分頁的區別是什麼?
129. mybatis 是否支持延遲加載?延遲加載的原理是什麼?
130. 說一下 mybatis 的一級緩存和二級緩存?
131. mybatis 和 hibernate 的區別有哪些?
132. mybatis 有哪些執行器(Executor)?
133. mybatis 分頁插件的實現原理是什麼?
134. mybatis 如何編寫一個自定義插件?
14. RabbitMQ
135. rabbitmq 的使用場景有哪些?
136. rabbitmq 有哪些重要的角色?
137. rabbitmq 有哪些重要的組件?
138. rabbitmq 中 vhost 的做用是什麼?
139. rabbitmq 的消息是怎麼發送的?
140. rabbitmq 怎麼保證消息的穩定性?
141.rabbitmq 怎麼避免消息丟失?
142. 要保證消息持久化成功的條件有哪些?
143. rabbitmq 持久化有什麼缺點?
144. rabbitmq 有幾種廣播類型?
145. rabbitmq 怎麼實現延遲消息隊列?
146. rabbitmq 集羣有什麼用?
147. rabbitmq 節點的類型有哪些?
148. rabbitmq 集羣搭建須要注意哪些問題?
149. rabbitmq 每一個節點是其餘節點的完整拷貝嗎?爲何?
150. rabbitmq 集羣中惟一一個磁盤節點崩潰了會發生什麼狀況?
151. rabbitmq 對集羣節點中止順序有要求嗎?
15. Kafka
152. kafka 能夠脫離 zookeeper 單獨使用嗎?爲何?
153. kafka 有幾種數據保留的策略?
154. kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
155. 什麼狀況會致使 kafka 運行變慢?
156. 使用 kafka 集羣須要注意什麼?
16. Zookeeper
157. zookeeper 是什麼?
158. zookeeper 都有哪些功能?
159. zookeeper 有幾種部署模式?
160. zookeeper 怎麼保證主從節點的狀態同步?
161. 集羣中爲何要有主節點?
162. 集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可使用嗎?
163. 說一下 zookeeper 的通知機制?
17. MySql
164. 數據庫的三範式是什麼?
165. 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 mysql 數據庫,又插入了一條數據,此時 id 是幾?
166. 如何獲取當前數據庫版本?
167. 說一下 ACID 是什麼?
168. char 和 varchar 的區別是什麼?
169. float 和 double 的區別是什麼?
170. mysql 的內鏈接、左鏈接、右鏈接有什麼區別?
171. mysql 索引是怎麼實現的?
172. 怎麼驗證 mysql 的索引是否知足需求?
173. 說一下數據庫的事務隔離?
174. 說一下 mysql 經常使用的引擎?
innoDB, MyISAM
175. 說一下 mysql 的行鎖和表鎖?
176. 說一下樂觀鎖和悲觀鎖?
177. mysql 問題排查都有哪些手段?
178. 如何作 mysql 的性能優化?
18. Redis
179. redis 是什麼?都有哪些使用場景?
180. redis 有哪些功能?
181. redis 和 memecache 有什麼區別?
182. redis 爲何是單線程的?
183. 什麼是緩存穿透?怎麼解決?
184. redis 支持的數據類型有哪些?
185. redis 支持的 java 客戶端都有哪些?
186. jedis 和 redisson 有哪些區別?
187. 怎麼保證緩存和數據庫數據的一致性?
188. redis 持久化有幾種方式?
189.redis 怎麼實現分佈式鎖?
190. redis 分佈式鎖有什麼缺陷?
191. redis 如何作內存優化?
192. redis 淘汰策略有哪些?
193. redis 常見的性能問題有哪些?該如何解決?
19. JVM
194. 說一下 jvm 的主要組成部分?及其做用?
195. 說一下 jvm 運行時數據區?
196. 說一下堆棧的區別?
197. 隊列和棧是什麼?有什麼區別?
198. 什麼是雙親委派模型?
首先會檢查請求加載的類是否已經被加載過;
若沒有被加載過:
遞歸調用父類加載器的loadClass();
父類加載器爲空後就使用啓動類加載器加載;
若是父類加載器和啓動類加載器均沒法加載請求,則調用自身的加載功能。
199. 說一下類加載的執行過程?
1. 加載
加載,是指Java虛擬機查找字節流(查找.class文件),而且根據字節流建立java.lang.Class對象的過程。這個過程,將類的.class文件中的二進制數據讀入內存,放在運行時區域的方法區內。而後在堆中建立java.lang.Class對象,用來封裝類在方法區的數據結構。
類加載階段:
(1)Java虛擬機將.class文件讀入內存,併爲之建立一個Class對象。
(2)任何類被使用時系統都會爲其建立一個且僅有一個Class對象。
(3)這個Class對象描述了這個類建立出來的對象的全部信息,好比有哪些構造方法,都有哪些成員方法,都有哪些成員變量等。
Student類加載過程圖示:
2. 連接
連接包括驗證、準備以及解析三個階段。
(1)驗證階段。主要的目的是確保被加載的類(.class文件的字節流)知足Java虛擬機規範,不會形成安全錯誤。
(2)準備階段。負責爲類的靜態成員分配內存,並設置默認初始值。
(3)解析階段。將類的二進制數據中的符號引用替換爲直接引用。
說明:
符號引用。即一個字符串,可是這個字符串給出了一些可以惟一性識別一個方法,一個變量,一個類的相關信息。
直接引用。能夠理解爲一個內存地址,或者一個偏移量。好比類方法,類變量的直接引用是指向方法區的指針;而實例方法,實例變量的直接引用則是從實例的頭指針開始算起到這個實例變量位置的偏移量。
舉個例子來講,如今調用方法hello(),這個方法的地址是0xaabbccdd,那麼hello就是符號引用,0xaabbccdd就是直接引用。
在解析階段,虛擬機會把全部的類名,方法名,字段名這些符號引用替換爲具體的內存地址或偏移量,也就是直接引用。
3. 初始化
初始化,則是爲標記爲常量值的字段賦值的過程。換句話說,只對static修飾的變量或語句塊進行初始化。
若是初始化一個類的時候,其父類還沒有初始化,則優先初始化其父類。
若是同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
https://www.cnblogs.com/luohanguo/p/9469851.html
200. 怎麼判斷對象是否能夠被回收?
引用計數法就是若是一個對象沒有被任何引用指向,則可視之爲垃圾。這種方法的缺點就是不能檢測到環的存在。
首先須要聲明,至少主流的Java虛擬機裏面都沒有選用引用計數算法來管理內存。
什麼是引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值加1;當引用失效時,計數器值減1.任什麼時候刻計數器值爲0的對象就是不可能再被使用的。那爲何主流的Java虛擬機裏面都沒有選用這種算法呢?其中最主要的緣由是它很難解決對象之間相互循環引用的問題。
根搜索算法的基本思路就是經過一系列名爲」GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證實此對象是不可用的。
這個算法的基本思想是經過一系列稱爲「GC Roots」的對象做爲起始點,從這些節點向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots沒有任何引用鏈(即GC Roots到對象不可達)時,則證實此對象是不可用的。
那麼問題又來了,如何選取GCRoots對象呢?在Java語言中,能夠做爲GCRoots的對象包括下面幾種:
(1). 虛擬機棧(棧幀中的局部變量區,也叫作局部變量表)中引用的對象。
(2). 方法區中的類靜態屬性引用的對象。
(3). 方法區中常量引用的對象。
(4). 本地方法棧中JNI(Native方法)引用的對象。
201. java 中都有哪些引用類型?
四種引用類型:強引用,軟引用,弱引用,虛引用。
202. 說一下 jvm 有哪些垃圾回收算法?
標記-清除算法(Mark-Sweep)
複製算法(Copying)
標記-整理算法(Mark-compact)
分代收集算法
203. 說一下 jvm 有哪些垃圾回收器?
-XX:+UseSerialGC
來強制指定。-XX:+UseParallelGC
來強制指定,用-XX:ParallelGCThreads=4
來指定線程數。204. 詳細介紹一下 CMS 垃圾回收器?
205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?
206. 簡述分代垃圾回收器是怎麼工做的?
207. 說一下 jvm 調優的工具?
208. 經常使用的 jvm 調優的參數都有哪些?