深入理解-JVM&G1 GC

深入理解-JVM&G1 GC pdf epub mobi txt 電子書 下載 2025

周明耀 著
圖書標籤:
  • JVM
  • G1GC
  • 垃圾迴收
  • 性能調優
  • Java
  • 虛擬機
  • 內存管理
  • 並發
  • HotSpot
  • 底層原理
想要找書就要到 靜思書屋
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
店鋪: 江陰新華書店圖書專營店
齣版社: 電子工業齣版社
ISBN:9787121314681
商品編碼:23431190575
包裝:平裝-膠訂
開本:128
齣版時間:2017-06-01

具體描述


內容介紹
  G1GC提齣瞭不確定性Region,每個空閑Region不是為某個固定年代準備的,它是靈活的,需求驅動的,所以G1GC代錶瞭XJ性。   《深入理解JVM&G1GC》主要為學習Java語言的學生、初級程序員提供GC的使用參考建議及經驗,著重介紹瞭G1GC。中國的軟件開發行業已經有幾十年瞭,從目前的行業發展來看,單純的軟件公司很難有發展,目前流行的雲計算、物聯網企業實際上是綜閤性IT技術的整閤,這J需要有綜閤能力的程序員。《深入理解JVM&G1GC》作者力求做到知識的綜閤傳播,而不是僅僅針對Java虛擬機和GC調優進行講解,也力求每一章節都有實際的案例支撐。《深入理解JVM&G1GC》具體包括以下幾方麵:JVM基礎知識、GC基礎知識、G1GC的深入介紹、G1GC調優建議、JDK自帶工具使用介紹等。   通讀《深入理解JVM&G1GC》後,讀者可以深入瞭解G1GC性能調優的許多主題及相關的綜閤性知識。讀者也可以把《深入理解JVM&G1GC》作為參考,對於感興趣的主題,直接跳到相應章節尋找答案。

關聯推薦

  ★沒有一招鮮似的調優秘籍或包羅萬象的性能百科

  ★GC性能調優需要專門的知識技能纔能解決

  ★解決的GC性能問題越多,技藝纔會越精湛

  ★《深入理解JVM & G1 GC》不僅有技術實踐,還有設計原理和目標

  ★讓你深入掌握GC,積纍更多技術與經驗,

  ★更好地提升産品性能

 
目錄
目  錄 序 VII 前言 IX D1章 JVM & GC基礎知識 1 1.1 引言 2 1.2 基本術語 3 1.2.1 Java相關術語 4 1.2.2 JVM/GC通用術語 24 1.2.3 G1涉及術語 56 1.3 本章小結 62 D2章 JVM & GC深入知識 63 2.1 Java虛擬機內存模型 64 2.1.1 程序計數器 65目  錄

序 VII
前言 IX
D1章 JVM & GC基礎知識 1
1.1 引言 2
1.2 基本術語 3
1.2.1 Java相關術語 4
1.2.2 JVM/GC通用術語 24
1.2.3 G1涉及術語 56
1.3 本章小結 62
D2章 JVM & GC深入知識 63
2.1 Java虛擬機內存模型 64
2.1.1 程序計數器 65
2.1.2 虛擬機棧 66
2.1.3 本地方法棧 72
2.1.4 Java堆 73
2.1.5 方法區 79
2.2 垃圾收集算法 82
2.2.1 引用計數法 82
2.2.2 根搜索算法 83
2.2.3 標記-清除算法(Mark-Sweep) 85
2.2.4 復製算法(Copying) 87
2.2.5 標記-壓縮算法(Mark-Compact) 89
2.2.6 增量算法(Incremental Collecting) 90
2.2.7 分代收集算法(Generational Collecting) 91
2.3 Garbage Collection 92
2.3.1 GC概念 92
2.3.2 垃圾收集器分類 93
2.3.3 Serial收集器 94
2.3.4 ParNew收集器 96
2.3.5 Parallel收集器 99
2.3.6 CMS收集器 102
2.3.7 Garbage First(G1)GC 106
2.4 常見問題解析 112
2.4.1 jmap -heap或-histo不能用 112
2.4.2 YGC越來越慢 112
2.4.3 JavaYJ代去哪兒瞭 114
2.5 本章小結 116
D3章 G1 GC應用示例 117
3.1 範例程序 118
3.2 選項解釋及應用 124
3.3 本章小結 166
D4章 深入G1 GC 167
4.1 G1 GC概念簡述 168
4.1.1 背景知識 168
4.1.2 G1的垃圾迴收機製 169
4.1.3 G1的區間設計靈感 169
4.2 G1 GC分代管理 172
4.2.1 年輕代 172
4.2.2 年輕代迴收暫停 173
4.2.3 大對象區間 174
4.2.4 混閤迴收暫停 176
4.2.5 迴收集閤及其重要性 178
4.2.6 RSet及其重要性 178
4.2.7 並行標記循環 182
4.2.8 評估失敗和WQ迴收 186
4.3 G1 GC使用場景 186
4.4 G1 GC論文原文翻譯(部分) 187
4.4.1 開題 187
4.4.2 數據結構/機製 188
4.4.3 未來展望 190
4.5 本章小結 191
D5章 G1 GC性能優化方案 192
5.1 G1的年輕代迴收 193
5.2 年輕代優化 203
5.3 並行標記階段優化 205
5.4 混閤迴收階段 207
5.4.1 初步介紹 207
5.4.2 深入介紹 208
5.5 如何避免齣現GC失敗 210
5.6 引用處理 211
5.6.1 觀察引用處理 212
5.6.2 引用處理優化 213
5.7 本章小結 214
D6章 JVM診斷工具使用介紹 215
6.1 SA基礎介紹 216
6.2 SA工具使用實踐 217
6.2.1 如何啓動SA 217
6.2.2 SA原理及使用介紹 222
6.3 其他工具介紹 231
6.3.1 GCHisto 231
6.3.2 JConsole 232
6.3.3 VisualVM 236
6.4 本章小結 238 顯示全部信息

在綫試讀
  2.2.1 引用計數法   引用計數法(Reference Counting)在GC執行垃圾迴收之前,1先需要區分齣內存中哪些是存活對象,哪些是已經死亡的對象。隻有被標記為已經死亡的對象,GC纔會在執行垃圾迴收時,釋放掉其所占用的內存空間,因此這個過程我們可以稱為垃圾標記階段。   引用計數器的實現很簡單,對於一個對象A,隻要有任何一個對象引用瞭A,則A的引用計數器J加1,D引用失效時,引用計數器J減1。隻要對象A的引用計數器的值為0,則對象AJ不可能再被使用。也J是說,引用計數器的實現隻需要為每個對象配置一個整形的計數器即可。引用計數器算法的一大優勢J是不用等待內存不夠用的時候,纔進行垃圾的迴收,WQ可以在賦值操作的同時檢查計數器是否為0,如果是的話J可以立即迴收。   但是引用計數器有一個嚴重的問題,即無法處理循環引用的情況。一個簡單的循環引用問題的描述如下:有對象A和對象B,對象A中含有對象B的引用,對象B中含有對象A的引用。此時,對象A和對象B的引用計數器都不為0,但是在係統中卻不存在任何D3個對象引用瞭A或B。也J是說,A和B是應該被迴收的垃圾對象,但由於垃圾對象間相互引用,從而使垃圾迴收器無法識彆,引起內存泄漏。   如圖2-6所示,構造瞭一個列錶,將Z後一個元素的next屬性指嚮D一個元素,即引用D一個元素,從而構成循環引用。這個時候如果將列錶的頭head賦值為null,此時列錶的各個元素的計數器都不為0,同時也失去瞭對列錶的引用控製,從而導緻列錶元素不能被迴收。   引用計數器擁有一些特性,1先它需要單D的字段存儲計數器,這樣的做法增加瞭存儲空間的開銷。其次,每次賦值都需要更新計數器,這增加瞭時間開銷。再者,垃圾對象便於辨識,隻要計數器為0,J可作為垃圾迴收。接下來它能方便及時地迴收垃圾,沒有延遲性。Z後不能解決循環引用的問題。正是由於Z後一條緻命缺陷,導緻在Java的垃圾迴收器中沒有使用這類算法。

  2.2.1 引用計數法

 

  引用計數法(Reference Counting)在GC執行垃圾迴收之前,1先需要區分齣內存中哪些是存活對象,哪些是已經死亡的對象。隻有被標記為已經死亡的對象,GC纔會在執行垃圾迴收時,釋放掉其所占用的內存空間,因此這個過程我們可以稱為垃圾標記階段。

 

  引用計數器的實現很簡單,對於一個對象A,隻要有任何一個對象引用瞭A,則A的引用計數器J加1,D引用失效時,引用計數器J減1。隻要對象A的引用計數器的值為0,則對象AJ不可能再被使用。也J是說,引用計數器的實現隻需要為每個對象配置一個整形的計數器即可。引用計數器算法的一大優勢J是不用等待內存不夠用的時候,纔進行垃圾的迴收,WQ可以在賦值操作的同時檢查計數器是否為0,如果是的話J可以立即迴收。

 

  但是引用計數器有一個嚴重的問題,即無法處理循環引用的情況。一個簡單的循環引用問題的描述如下:有對象A和對象B,對象A中含有對象B的引用,對象B中含有對象A的引用。此時,對象A和對象B的引用計數器都不為0,但是在係統中卻不存在任何D3個對象引用瞭A或B。也J是說,A和B是應該被迴收的垃圾對象,但由於垃圾對象間相互引用,從而使垃圾迴收器無法識彆,引起內存泄漏。

 

  如圖2-6所示,構造瞭一個列錶,將Z後一個元素的next屬性指嚮D一個元素,即引用D一個元素,從而構成循環引用。這個時候如果將列錶的頭head賦值為null,此時列錶的各個元素的計數器都不為0,同時也失去瞭對列錶的引用控製,從而導緻列錶元素不能被迴收。

 

  引用計數器擁有一些特性,1先它需要單D的字段存儲計數器,這樣的做法增加瞭存儲空間的開銷。其次,每次賦值都需要更新計數器,這增加瞭時間開銷。再者,垃圾對象便於辨識,隻要計數器為0,J可作為垃圾迴收。接下來它能方便及時地迴收垃圾,沒有延遲性。Z後不能解決循環引用的問題。正是由於Z後一條緻命缺陷,導緻在Java的垃圾迴收器中沒有使用這類算法。

 

  2.2.2 根搜索算法

 

  HotSpot和大部分JVM都是使用根搜索算法作為垃圾標記的算法實現。前麵介紹過的引用計數算法盡管實現簡單,執行效率也不錯,但是該算法本身卻存在一個較大的弊端,甚至會影響到垃圾標記的準確性。由於引用計數算法會為程序中的每一個對象都創建一個私有的引用計數器,D目標對象被其他存活對象引用時,引用計數器中的值則會加1,不再引用時便會減1,D引用計數器中的值為0的時候,J意味著該對象已經不再被任何存活對象引用,可以被標記為垃圾對象。采用這種方式看起來似乎沒有任何問題,但是如果一些明顯已經死亡瞭的對象盡管沒有被任何的存活對象引用,但是它們彼此之間卻存在相互引用時,引用計數器中的值則永遠不會為0,這樣便會導緻GC在執行內存迴收時永遠無法釋放掉這種無用對象所占用的內存空間,J有可能引發內存泄漏。

 

  相對於引用計數算法而言,根搜索算法不僅同樣具備實現簡單和執行高效等特點,更重要的是該算法可以有效地解決在引用計數算法中一些已經死亡的對象因相互引用而導緻的無法正確被標記的問題,防止內存泄漏的發生。簡單來說,根搜索算法是以根對象集閤為起始點,按照從上至下的方式搜索被根對象集閤所連接的目標對象是否可達(使用根搜索算法後,內存中的存活對象都會被根對象集閤直接或間接連接著),如果目標對象不可達,J意味著該對象已經死亡,便可以在instanceOopDesc[ HotSpot在C 代碼中用instanceOopDesc類來錶示Java對象,而該類繼承oopDesc,所以HotSpot中的Java對象也自然擁有oopDesc所聲明的頭部。]的Mark World中將其標記為垃圾對象。在根搜索算法中,隻有能夠被根對象集閤直接或者間接連接的對象纔是存活對象。在HotSpot中,根對象集閤中包含瞭5個元素,Java棧內的對象引用、本地方法棧內的對象引用、運行時常量池中的對象引用、方法區中類靜態屬性的對象引用以及與一個類對應的W一數據類型的Class對象。

顯示全部信息
《Java虛擬機與內存管理:從底層原理到實踐優化》 內容簡介: 在紛繁復雜的軟件開發領域,Java以其跨平颱、麵嚮對象、健壯性等特性,長期占據著核心地位。然而,要真正駕馭Java,僅僅掌握語法和API是遠遠不夠的。隱藏在語言之下的,是Java虛擬機(JVM)這颱強大的“引擎”,以及其精妙絕倫的內存管理機製。本書正是為那些渴望觸及Java本質、精通JVM底層原理、並在實際開發中實現性能飛躍的開發者而精心打造。 本書並非泛泛而談,而是以“深入理解”為目標,層層剖析Java虛擬機的工作機製。我們將從最基礎的JVM內存模型入手,詳細解析堆(Heap)、棧(Stack)、方法區(Method Area)、程序計數器(PC Register)、本地方法棧(Native Method Stack)等各個區域的劃分、作用以及生命周期。你將瞭解到,每一次Java對象的創建、方法調用的發生,背後都涉及JVM內存的精細運作。我們將揭示對象在堆中的存儲細節,變量在棧中的傳遞方式,以及方法區如何存儲類信息、常量池和即時編譯(JIT)代碼。 理解瞭內存區域,我們自然會深入到Java垃圾迴收(Garbage Collection, GC)的核心。垃圾迴收是JVM自動管理內存的關鍵,它直接關係到程序的性能和穩定性。本書將係統地梳理經典的垃圾迴收算法,包括標記-清除(Mark-Sweep)、標記-整理(Mark-Compact)、復製(Copying)等,並詳細闡述它們的工作原理、優缺點以及適用場景。在此基礎上,我們將重點解析當前主流的幾種垃圾迴收器,例如Serial、Parallel、CMS(Concurrent Mark Sweep)以及尤為重要的G1(Garbage-First)垃圾迴收器。 對於G1垃圾迴收器,本書將投入大量篇幅進行詳盡的講解。G1作為一種麵嚮服務器的、並行、並發、區域化的垃圾迴收器,以其預測停頓時間(Predictive Pause Time)的特性,在大型Java應用中備受青睞。我們將深入剖析G1的區域化內存模型(Region-based Memory Model),以及其垃圾迴收的整個生命周期,包括初始化(Initialization)、年輕代垃圾迴收(Young GC)、混閤垃圾迴收(Mixed GC)、並發標記(Concurrent Marking)、清理(Cleanup)等階段。你將瞭解到G1如何高效地選擇迴收區域,如何進行並發標記和清理,以及如何通過調整參數來達到期望的GC停頓時間。此外,本書還將探討G1可能遇到的挑戰,如吞吐量與延遲的權衡,以及如何根據實際應用場景進行調優。 除瞭理論的深度,本書更注重實踐的指導。我們將提供大量真實場景下的JVM調優案例,結閤具體的生産環境問題,演示如何使用各種JVM工具,如`jps`、`jstat`、`jmap`、`jstack`、MAT(Memory Analyzer Tool)、VisualVM等,來診斷和分析JVM的內存泄漏、性能瓶頸、GC停頓等問題。你將學會如何閱讀GC日誌,理解GC日誌中的各種指標,並據此製定有效的調優策略。我們將演示如何通過調整JVM啓動參數,例如堆大小 `-Xms`、`-Xmx`,新生代大小 `-Xmn`,GC綫程數 `-XX:ParallelGCThreads`,以及G1相關的參數如 `-XX:MaxGCPauseMillis`、`-XX:G1HeapRegionSize`等,來優化JVM的運行效率。 本書的內容涵蓋瞭Java內存管理從宏觀到微觀的各個層麵。在宏觀層麵,我們將討論Java內存模型的可見性、原子性和順序性問題,以及Java內存模型(JMM)與CPU緩存一緻性協議(MESI等)之間的關係,為理解並發編程中的“可見性”和“原子性”提供堅實的基礎。在微觀層麵,我們將深入到對象的創建、引用的類型(強引用、軟引用、弱引用、虛引用)及其在垃圾迴收中的作用,以及字符串常量池、類加載機製、類初始化時機等影響內存布局和GC行為的關鍵概念。 本書的目標讀者包括: 有一定Java基礎,渴望深入理解JVM底層原理的開發者。 在實際開發中遇到JVM性能問題,需要進行調優的工程師。 對Java內存模型、垃圾迴收機製、並發編程感興趣的研究者。 希望提升Java應用穩定性和執行效率的技術管理者。 閱讀本書,你將不再是簡單地使用Java,而是真正理解Java“如何工作”,並能主動地解決和預防Java應用中的各種性能和內存問題。我們將引導你走齣“知其然,不知其所以然”的睏境,讓你成為一名更具洞察力、更可靠的Java開發者,能夠自信地應對復雜的係統挑戰,為構建高性能、高可用的Java應用奠定堅實的基礎。 本書的每一章節都力求做到內容翔實、邏輯清晰、圖文並茂,並輔以精心設計的示例代碼和實驗。我們相信,通過本書的學習,你將能夠: 清晰地闡述Java內存模型,並理解其對並發編程的影響。 熟練掌握JVM的內存區域劃分及其生命周期。 深入理解各種垃圾迴收算法的原理和適用場景。 精通G1垃圾迴收器的內部機製,並能有效進行調優。 掌握使用JVM工具診斷和解決內存及性能問題的技巧。 能夠獨立進行JVM參數調優,以達到最佳的性能錶現。 理解Java對象的引用類型及其在內存管理中的作用。 掌握類加載與初始化的細節,以及它們與內存的關係。 無論你是初入Java開發的新手,還是經驗豐富的架構師,本書都將為你提供寶貴的知識和實用的技能,幫助你在Java技術棧上更上一層樓,構建齣真正強大、高效的應用程序。現在,就讓我們一起踏上這場深入理解Java虛擬機與內存管理的精彩旅程吧!

用戶評價

評分

讀完《深入理解-JVM&G1 GC》的幾章,我最大的感受就是“豁然開朗”。我之前在學習JVM和GC時,總感覺很多概念像是隔著一層紗,看不真切。這本書就像是一把鑰匙,一下子就打開瞭我的思維。作者的寫作風格非常獨特,他擅長將復雜的概念拆解開來,用類比、故事化的方式來講解,使得原本枯燥的技術內容變得生動有趣。比如,他講解JVM內存模型的時候,用“大酒店”來比喻堆內存,每個區域的功能就像酒店的不同服務部門,非常形象。而對於G1 GC,作者更是花費瞭大量的篇幅進行深入剖析,從它的“全局視野”到“區域優先”的收集策略,再到如何平衡吞吐量和延遲,都解釋得非常清楚。我特彆喜歡書中關於G1 GC如何進行增量式收集的講解,以及它如何通過預測模型來選擇收集的區域,這讓我對G1 GC的“智能”有瞭更深的認識。此外,書中還提供瞭一些關於如何觀察JVM運行狀態、分析GC日誌的技巧,這些都是我們在實際工作中經常會遇到的問題,有瞭這本書,感覺解決起來會更有章法。總而言之,這本書的講解方式和內容深度都讓我非常滿意,它確實能幫助我們“深入理解”JVM和G1 GC。

評分

這是一本讓我愛不釋手的JVM和G1 GC方麵的著作。《深入理解-JVM&G1 GC》這本書給我的第一印象就是“透徹”。它不像市麵上很多講解JVM的書籍那樣,隻停留在錶麵,而是真正地深入到JVM的內部,為你揭開那層神秘的麵紗。作者在解釋JVM的內存模型時,就像一位經驗豐富的導遊,帶領我們一步步探索堆、棧、元空間等各個區域的奧秘,並且清晰地闡述瞭它們各自的職責和生命周期。尤其讓我印象深刻的是關於G1 GC的章節。我之前對G1 GC的瞭解僅限於它是“一種高效的垃圾迴收器”,但這本書讓我明白瞭它為何高效,它是如何通過將整個Java堆劃分為多個大小相等的區域,並根據區域的垃圾量進行優先收集的。書中的很多插圖都非常有幫助,例如描述G1 GC的收集過程、暫停時間預測模型等,都讓我能夠非常直觀地理解這些復雜的算法。此外,作者還分享瞭一些關於JVM參數調優的實用技巧,以及如何通過監控工具來分析GC日誌,這對於我們這些實際開發中需要關注性能的開發者來說,具有極高的參考價值。這本書的深度和廣度都讓我非常滿意,它絕對是我書架上的一本常備參考書。

評分

我最近剛開始讀《深入理解-JVM&G1 GC》,說實話,一開始是被它的名字吸引的。我一直覺得JVM是一個很玄乎的東西,尤其是垃圾迴收,感覺像是個黑盒子,不知道裏麵到底是怎麼運作的。這本書的開篇就給瞭我很大的驚喜。它沒有上來就講一堆晦澀難懂的理論,而是從一個很自然的切入點——“為什麼需要垃圾迴收”開始,一步步引齣JVM的內存模型。我特彆喜歡它對新生代、老年代、Eden區、Survivor區這些概念的解釋,感覺就像在給我們講故事一樣,把原本枯燥的內存劃分講得生動形象。然後到瞭G1 GC的部分,我原本以為會是一場硬仗,但作者的講解方式齣乎意料地清晰。他把G1 GC比作一個聰明的“區域劃分管理者”,詳細講解瞭如何將堆劃分為一個個小區域,以及如何通過“區域優先”的策略來高效地進行垃圾迴收。書中的配圖也非常給力,很多復雜的流程圖都畫得非常簡潔明瞭,讓我能夠快速抓住重點。而且,書中還提到瞭如何通過一些JVM參數來調優G1 GC,這一點對我來說非常實用,因為我經常在工作中遇到性能瓶頸,希望這本書能提供一些實操的解決方案。目前還在學習中,但已經感受到這本書的價值瞭。

評分

剛拿到《深入理解-JVM&G1 GC》這本書,還沒來得及深入研讀,但僅僅是粗略翻閱,我就被其紮實的內容和清晰的邏輯所摺服。作為一名程序員,對JVM的理解程度直接影響到程序性能的優化和問題的排查效率,而G1 GC作為當前主流的垃圾迴收器,更是重中之重。這本書的亮點在於它並沒有局限於理論的堆砌,而是通過大量的圖示、流程圖以及源碼級彆的分析,將JVM的內部機製,特彆是G1 GC的運作原理,展示得淋灕盡緻。我特彆欣賞作者對於JVM內存模型和垃圾迴收算法的講解,他能夠將復雜的概念化繁為簡,用通俗易懂的語言來闡述,讓即使是初學者也能快速入門。對於G1 GC,作者詳細介紹瞭其分代、分區、區域收集、增量式收集等關鍵技術,並且深入剖析瞭其在不同場景下的適用性和調優策略。書中還涉及瞭一些JVM調優的實戰技巧,這對於我這種需要在生産環境中處理性能問題的開發者來說,無疑是雪中送炭。我相信,通過這本書的學習,我能夠更精準地定位JVM性能瓶頸,並有效地進行調優,從而提升我開發程序的健壯性和效率。

評分

作為一名在Java開發領域摸爬滾打多年的老兵,最近入手瞭一本名為《深入理解-JVM&G1 GC》的書,雖然內容還沒有完全消化,但初步的翻閱已經讓我受益匪淺,對JVM和G1 GC的理解上升到瞭一個新的層次。這本書的優點在於其內容的深度和廣度。它並沒有停留在錶麵的API介紹,而是深入挖掘瞭JVM底層的運行機製,從類加載、內存模型到垃圾迴收算法,都進行瞭詳盡的闡述。特彆是G1 GC部分,作者用非常直觀的方式,結閤大量的圖示和代碼示例,將G1 GC的區域劃分、垃圾迴收流程、暫停時間預測等核心概念一一剖析。我之前對G1 GC的理解一直有些模糊,總是覺得它很復雜,難以掌握。但通過這本書的學習,我仿佛打通瞭任督二脈,對G1 GC的工作原理有瞭清晰的認識,也明白瞭它在不同場景下如何進行優化。書中對於堆內存、棧內存、元空間等各個內存區域的劃分和作用的講解也十分到位,幫助我更準確地判斷和解決內存溢齣、內存泄漏等常見問題。此外,作者在書中穿插瞭一些實戰案例,讓理論知識與實際應用緊密結閤,大大增強瞭學習的趣味性和有效性。總而言之,這本書對於想要深入理解JVM和G1 GC的開發者來說,無疑是一本不可多得的寶典。

相關圖書

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有