欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)單理解Java的垃圾回收機(jī)制與finalize方法的作用

 更新時(shí)間:2015年11月12日 15:58:21   作者:邊緣元素  
這篇文章主要介紹了簡(jiǎn)單理解Java的垃圾回收機(jī)制與finalize方法的作用,著重講解了Java的GC銷毀對(duì)象的過(guò)程,需要的朋友可以參考下

垃圾回收器要回收對(duì)象的時(shí)候,首先要調(diào)用這個(gè)類的finalize方法(你可以 寫程序驗(yàn)證這個(gè)結(jié)論),一般的純Java編寫的Class不需要重新覆蓋這個(gè)方法,因?yàn)镺bject已經(jīng)實(shí)現(xiàn)了一個(gè)默認(rèn)的,除非我們要實(shí)現(xiàn)特殊的功能(這 里面涉及到很多東西,比如對(duì)象空間樹等內(nèi)容)。
不過(guò)用Java以外的代碼編寫的Class(比如JNI,C++的new方法分配的內(nèi)存),垃圾回收器并不能對(duì)這些部分進(jìn)行正確的回收,這時(shí)就需要我們覆蓋默認(rèn)的方法來(lái)實(shí)現(xiàn)對(duì)這部分內(nèi)存的正確釋放和回收(比如C++需要delete)。
總之,finalize相當(dāng)于析構(gòu)函數(shù),他是垃圾回收器回收一個(gè)對(duì)象的時(shí)候第一個(gè)要調(diào)用的方法。不過(guò)由于Java的垃圾回收機(jī)制能自動(dòng)為我們做這些事情,所以我們?cè)谝话闱闆r下是不需要自己來(lái)手工釋放的。

有時(shí)當(dāng)撤消一個(gè)對(duì)象時(shí),需要完成一些操作。例如,如果一個(gè)對(duì)象正在處理的是非Java 資源,如文件句柄或window 字符字體,這時(shí)你要確認(rèn)在一個(gè)對(duì)象被撤消以前要保證這些資源被釋放。為處理這樣的狀況,Java 提供了被稱為收尾(finalization )的機(jī)制。使用該機(jī)制你可以定義一些特殊的操作,這些操作在一個(gè)對(duì)象將要被垃圾回收程序釋放時(shí)執(zhí)行。
要給一個(gè)類增加收尾(finalizer ),你只要定義finalize ( ) 方法即可。Java 回收該類的一個(gè)對(duì)象時(shí),就會(huì)調(diào)用這個(gè)方法。在finalize ( )方法中,你要指定在一個(gè)對(duì)象被撤消前必須執(zhí)行的操作。垃圾回收周期性地運(yùn)行,檢查對(duì)象不再被運(yùn)行狀態(tài)引用或間接地通過(guò)其他對(duì)象引用。就在對(duì)象被釋放之 前,Java 運(yùn)行系統(tǒng)調(diào)用該對(duì)象的finalize( ) 方法。

  finalize()方法的通用格式如下:

  protected void finalize( )
{
// finalization code here
}

  其中,關(guān)鍵字protected是防止在該類之外定義的代碼訪問(wèn)finalize()標(biāo)識(shí)符。該標(biāo)識(shí)符和其他標(biāo)識(shí)符將在第7章中解釋。

  理解finalize( ) 正好在垃圾回收以前被調(diào)用非常重要。例如當(dāng)一個(gè)對(duì)象超出了它的作用域時(shí),finalize( ) 并不被調(diào)用。這意味著你不可能知道何時(shí)——甚至是否——finalize( ) 被調(diào)用。因此,你的程序應(yīng)該提供其他的方法來(lái)釋放由對(duì)象使用的系統(tǒng)資源,而不能依靠finalize( ) 來(lái)完成程序的正常操作。

  注意:如果你熟悉C++,那你知道C++允許你為一個(gè)類定義一個(gè)撤消函數(shù)(destructor ),它在對(duì)象正好出作用域之前被調(diào)用。Java不支持這個(gè)想法也不提供撤消函數(shù)。finalize() 方法只和撤消函數(shù)的功能接近。當(dāng)你對(duì)Java 有豐富經(jīng)驗(yàn)時(shí),你將看到因?yàn)镴ava使用垃圾回收子系統(tǒng),幾乎沒有必要使用撤消函數(shù)。


finalize的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過(guò)程中,才會(huì)真正回收對(duì)象的內(nèi)存.所以如果使用finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除或清掃工作.

finalize()在什么時(shí)候被調(diào)用?
有三種情況

  1. 所有對(duì)象被Garbage Collection時(shí)自動(dòng)調(diào)用,比如運(yùn)行System.gc()的時(shí)候.
  2. 程序退出時(shí)為每個(gè)對(duì)象調(diào)用一次finalize方法。
  3. 顯式的調(diào)用finalize方法

除此以外,正常情況下,當(dāng)某個(gè)對(duì)象被系統(tǒng)收集為無(wú)用信息的時(shí)候,finalize()將被自動(dòng)調(diào)用,但是jvm不保證finalize()一定被調(diào)用,也就是說(shuō),finalize()的調(diào)用是不確定的,這也就是為什么sun不提倡使用finalize()的原因

有時(shí)當(dāng)撤消一個(gè)對(duì)象時(shí),需要完成一些操作。例如,如果一個(gè)對(duì)象正在處理的是非Java 資源,如文件句柄或window 字符字體,這時(shí)你要確認(rèn)在一個(gè)對(duì)象被撤消以前要保證這些資源被釋放。為處理這樣的狀況,Java 提供了被稱為收尾(finalization )的機(jī)制。使用該機(jī)制你可以定義一些特殊的操作,這些操作在一個(gè)對(duì)象將要被垃圾回收程序釋放時(shí)執(zhí)行。

要給一個(gè)類增加收尾(finalizer ),你只要定義finalize ( ) 方法即可。Java 回收該類的一個(gè)對(duì)象時(shí),就會(huì)調(diào)用這個(gè)方法。在finalize ( )方法中,你要指定在一個(gè)對(duì)象被撤消前必須執(zhí)行的操作。垃圾回收周期性地運(yùn)行,檢查對(duì)象不再被運(yùn)行狀態(tài)引用或間接地通過(guò)其他對(duì)象引用。就在對(duì)象被釋放之 前,Java 運(yùn)行系統(tǒng)調(diào)用該對(duì)象的finalize( ) 方法。

finalize()方法的通用格式如下:

protected void finalize( )
{
// finalization code here
}

其中,關(guān)鍵字protected是防止在該類之外定義的代碼訪問(wèn)finalize()標(biāo)識(shí)符。該標(biāo)識(shí)符和其他標(biāo)識(shí)符將在第7章中解釋。

理解finalize( ) 正好在垃圾回收以前被調(diào)用非常重要。例如當(dāng)一個(gè)對(duì)象超出了它的作用域時(shí),finalize( ) 并不被調(diào)用。這意味著你不可能知道何時(shí)——甚至是否——finalize( ) 被調(diào)用。因此,你的程序應(yīng)該提供其他的方法來(lái)釋放由對(duì)象使用的系統(tǒng)資源,而不能依靠finalize( ) 來(lái)完成程序的正常操作。

注意:如果你熟悉C++,那你知道C++允許你為一個(gè)類定義一個(gè)撤消函數(shù)(destructor ),它在對(duì)象正好出作用域之前被調(diào)用。Java不支持這個(gè)想法也不提供撤消函數(shù)。finalize() 方法只和撤消函數(shù)的功能接近。當(dāng)你對(duì)Java 有豐富經(jīng)驗(yàn)時(shí),你將看到因?yàn)镴ava使用垃圾回收子系統(tǒng),幾乎沒有必要使用撤消函數(shù)。

垃圾收集器在進(jìn)行垃圾收集的時(shí)候會(huì)自動(dòng)呼叫對(duì)象的finalize方法,用來(lái)進(jìn)行一些用戶自定義的非內(nèi)存清理工作,因?yàn)槔占鞑粫?huì)處理內(nèi)存以外的東西。所以,有的時(shí)候用戶需要定義一些清理的方法,比如說(shuō)處理文件和端口之類的非內(nèi)存資源。

1.JVM的gc概述
  
  gc即垃圾收集機(jī)制是指jvm用于釋放那些不再使用的對(duì)象所占用的內(nèi)存。java語(yǔ)言并不要求jvm有g(shù)c,也沒有規(guī)定gc如何工作。不過(guò)常用的jvm都有g(shù)c,而且大多數(shù)gc都使用類似的算法管理內(nèi)存和執(zhí)行收集操作。
  
  在充分理解了垃圾收集算法和執(zhí)行過(guò)程后,才能有效的優(yōu)化它的性能。有些垃圾收集專用于特殊的應(yīng)用程序。比如,實(shí)時(shí)應(yīng)用程序主要是為了避免垃圾收集中斷,而大多數(shù)OLTP應(yīng)用程序則注重整體效率。理解了應(yīng)用程序的工作負(fù)荷和jvm支持的垃圾收集算法,便可以進(jìn)行優(yōu)化配置垃圾收集器。
  
  垃圾收集的目的在于清除不再使用的對(duì)象。gc通過(guò)確定對(duì)象是否被活動(dòng)對(duì)象引用來(lái)確定是否收集該對(duì)象。gc首先要判斷該對(duì)象是否是時(shí)候可以收集。兩種常用的方法是引用計(jì)數(shù)和對(duì)象引用遍歷。
  
  1.1.引用計(jì)數(shù)
  
  引用計(jì)數(shù)存儲(chǔ)對(duì)特定對(duì)象的所有引用數(shù),也就是說(shuō),當(dāng)應(yīng)用程序創(chuàng)建引用以及引用超出范圍時(shí),jvm必須適當(dāng)增減引用數(shù)。當(dāng)某對(duì)象的引用數(shù)為0時(shí),便可以進(jìn)行垃圾收集。
  
  1.2.對(duì)象引用遍歷
  
  早期的jvm使用引用計(jì)數(shù),現(xiàn)在大多數(shù)jvm采用對(duì)象引用遍歷。對(duì)象引用遍歷從一組對(duì)象開始,沿著整個(gè)對(duì)象圖上的每條鏈接,遞歸確定可到達(dá)(reachable)的對(duì)象。如果某對(duì)象不能從這些根對(duì)象的一個(gè)(至少一個(gè))到達(dá),則將它作為垃圾收集。在對(duì)象遍歷階段,gc必須記住哪些對(duì)象可以到達(dá),以便刪除不可到達(dá)的對(duì)象,這稱為標(biāo)記(marking)對(duì)象。
  
  下一步,gc要?jiǎng)h除不可到達(dá)的對(duì)象。刪除時(shí),有些gc只是簡(jiǎn)單的掃描堆棧,刪除未標(biāo)記的未標(biāo)記的對(duì)象,并釋放它們的內(nèi)存以生成新的對(duì)象,這叫做清除(sweeping)。這種方法的問(wèn)題在于內(nèi)存會(huì)分成好多小段,而它們不足以用于新的對(duì)象,但是組合起來(lái)卻很大。因此,許多gc可以重新組織內(nèi)存中的對(duì)象,并進(jìn)行壓縮(compact),形成可利用的空間。
  
  為此,gc需要停止其他的活動(dòng)活動(dòng)。這種方法意味著所有與應(yīng)用程序相關(guān)的工作停止,只有g(shù)c運(yùn)行。結(jié)果,在響應(yīng)期間增減了許多混雜請(qǐng)求。另外,更復(fù)雜的gc不斷增加或同時(shí)運(yùn)行以減少或者清除應(yīng)用程序的中斷。有的gc使用單線程完成這項(xiàng)工作,有的則采用多線程以增加效率。
  
2.幾種垃圾回收機(jī)制
  
  2.1.標(biāo)記-清除收集器
  
  這種收集器首先遍歷對(duì)象圖并標(biāo)記可到達(dá)的對(duì)象,然后掃描堆棧以尋找未標(biāo)記對(duì)象并釋放它們的內(nèi)存。這種收集器一般使用單線程工作并停止其他操作。
  
  2.2.標(biāo)記-壓縮收集器
  
  有時(shí)也叫標(biāo)記-清除-壓縮收集器,與標(biāo)記-清除收集器有相同的標(biāo)記階段。在第二階段,則把標(biāo)記對(duì)象復(fù)制到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。
  
  2.3.復(fù)制收集器
  
  這種收集器將堆棧分為兩個(gè)域,常稱為半空間。每次僅使用一半的空間,jvm生成的新對(duì)象則放在另一半空間中。gc運(yùn)行時(shí),它把可到達(dá)對(duì)象復(fù)制到另一半空間,從而壓縮了堆棧。這種方法適用于短生存期的對(duì)象,持續(xù)復(fù)制長(zhǎng)生存期的對(duì)象則導(dǎo)致效率降低。
  
  2.4.增量收集器
  
  增量收集器把堆棧分為多個(gè)域,每次僅從一個(gè)域收集垃圾。這會(huì)造成較小的應(yīng)用程序中斷。
  
  2.5.分代收集器
  
  這種收集器把堆棧分為兩個(gè)或多個(gè)域,用以存放不同壽命的對(duì)象。jvm生成的新對(duì)象一般放在其中的某個(gè)域中。過(guò)一段時(shí)間,繼續(xù)存在的對(duì)象將獲得使用期并轉(zhuǎn)入更長(zhǎng)壽命的域中。分代收集器對(duì)不同的域使用不同的算法以優(yōu)化性能。
  
  2.6.并發(fā)收集器
  
  并發(fā)收集器與應(yīng)用程序同時(shí)運(yùn)行。這些收集器在某點(diǎn)上(比如壓縮時(shí))一般都不得不停止其他操作以完成特定的任務(wù),但是因?yàn)槠渌麘?yīng)用程序可進(jìn)行其他的后臺(tái)操作,所以中斷其他處理的實(shí)際時(shí)間大大降低。
  
  2.7.并行收集器
  
  并行收集器使用某種傳統(tǒng)的算法并使用多線程并行的執(zhí)行它們的工作。在多cpu機(jī)器上使用多線程技術(shù)可以顯著的提高java應(yīng)用程序的可擴(kuò)展性。

3.對(duì)象的銷毀過(guò)程

在對(duì)象的銷毀過(guò)程中,按照對(duì)象的finalize的執(zhí)行情況,可以分為以下幾種,系統(tǒng)會(huì)記錄對(duì)象的對(duì)應(yīng)狀態(tài):
unfinalized 沒有執(zhí)行finalize,系統(tǒng)也不準(zhǔn)備執(zhí)行。
finalizable 可以執(zhí)行finalize了,系統(tǒng)會(huì)在隨后的某個(gè)時(shí)間執(zhí)行finalize。
finalized 該對(duì)象的finalize已經(jīng)被執(zhí)行了。

GC怎么來(lái)保持對(duì)finalizable的對(duì)象的追蹤呢。GC有一個(gè)Queue,叫做F-Queue,所有對(duì)象在變?yōu)閒inalizable的時(shí)候會(huì)加入到該Queue,然后等待GC執(zhí)行它的finalize方法。

這時(shí)我們引入了對(duì)對(duì)象的另外一種記錄分類,系統(tǒng)可以檢查到一個(gè)對(duì)象屬于哪一種。
reachable 從活動(dòng)的對(duì)象引用鏈可以到達(dá)的對(duì)象。包括所有線程當(dāng)前棧的局部變量,所有的靜態(tài)變量等等。
finalizer-reachable 除了reachable外,從F-Queue可以通過(guò)引用到達(dá)的對(duì)象。
unreachable 其它的對(duì)象。

來(lái)看看對(duì)象的狀態(tài)轉(zhuǎn)換圖。

20151112155733013.jpg (725×457)

好大,好暈,慢慢看。

1 首先,所有的對(duì)象都是從Reachable+Unfinalized走向死亡之路的。

2 當(dāng)從當(dāng)前活動(dòng)集到對(duì)象不可達(dá)時(shí),對(duì)象可以從Reachable狀態(tài)變到F-Reachable或者Unreachable狀態(tài)。

3 當(dāng)對(duì)象為非Reachable+Unfinalized時(shí),GC會(huì)把它移入F-Queue,狀態(tài)變?yōu)镕-Reachable+Finalizable。

4 好了,關(guān)鍵的來(lái)了,任何時(shí)候,GC都可以從F-Queue中拿到一個(gè)Finalizable的對(duì)象,標(biāo)記它為Finalized,然后執(zhí)行它的finalize方法,由于該對(duì)象在這個(gè)線程中又可達(dá)了,于是該對(duì)象變成Reachable了(并且Finalized)。而finalize方法執(zhí)行時(shí),又有可能把其它的F-Reachable的對(duì)象變?yōu)橐粋€(gè)Reachable的,這個(gè)叫做對(duì)象再生。

5 當(dāng)一個(gè)對(duì)象在Unreachable+Unfinalized時(shí),如果該對(duì)象使用的是默認(rèn)的Object的finalize,或者雖然重寫了,但是新的實(shí)現(xiàn)什么也不干。為了性能,GC可以把該對(duì)象之間變到Reclaimed狀態(tài)直接銷毀,而不用加入到F-Queue等待GC做進(jìn)一步處理。

6 從狀態(tài)圖看出,不管怎么折騰,任意一個(gè)對(duì)象的finalize只至多執(zhí)行一次,一旦對(duì)象變?yōu)镕inalized,就怎么也不會(huì)在回到F-Queue去了。當(dāng)然沒有機(jī)會(huì)再執(zhí)行finalize了。

7 當(dāng)對(duì)象處于Unreachable+Finalized時(shí),該對(duì)象離真正的死亡不遠(yuǎn)了。GC可以安全的回收該對(duì)象的內(nèi)存了。進(jìn)入Reclaimed。


對(duì)象重生的例子

class C { 
  static A a; 
} 
 
class A { 
  B b; 
 
  public A(B b) { 
    this.b = b; 
  } 
 
  @Override 
  public void finalize() { 
    System.out.println("A finalize"); 
    C.a = this; 
  } 
} 
 
class B { 
  String name; 
  int age; 
 
  public B(String name, int age) { 
    this.name = name; 
    this.age = age; 
  } 
 
  @Override 
  public void finalize() { 
    System.out.println("B finalize"); 
  } 
 
  @Override 
  public String toString() { 
    return name + " is " + age; 
  } 
} 
 
public class Main { 
  public static void main(String[] args) throws Exception { 
    A a = new A(new B("allen", 20)); 
    a = null; 
 
    System.gc(); 
    Thread.sleep(5000); 
    System.out.println(C.a.b); 
  } 
} 

期待輸出

A finalize 
B finalize 
allen is 20 

但是有可能失敗,源于GC的不確定性以及時(shí)序問(wèn)題,多跑幾次應(yīng)該可以有成功的。詳細(xì)解釋見文末的參考文檔。

    3.1對(duì)象的finalize的執(zhí)行順序

所有finalizable的對(duì)象的finalize的執(zhí)行是不確定的,既不確定由哪個(gè)線程執(zhí)行,也不確定執(zhí)行的順序。
考慮以下情況就明白為什么了,實(shí)例a,b,c是一組相互循環(huán)引用的finalizable對(duì)象。

    3.2何時(shí)及如何使用finalize

從以上的分析得出,以下結(jié)論。
(1) 最重要的,盡量不要用finalize,太復(fù)雜了,還是讓系統(tǒng)照管比較好。可以定義其它的方法來(lái)釋放非內(nèi)存資源。
(2) 如果用,盡量簡(jiǎn)單。
(3) 如果用,避免對(duì)象再生,這個(gè)是自己給自己找麻煩。
(4) 可以用來(lái)保護(hù)非內(nèi)存資源被釋放。即使我們定義了其它的方法來(lái)釋放非內(nèi)存資源,但是其它人未必會(huì)調(diào)用該方法來(lái)釋放。在finalize里面可以檢查一下,如果沒有釋放就釋放好了,晚釋放總比不釋放好。
(5) 即使對(duì)象的finalize已經(jīng)運(yùn)行了,不能保證該對(duì)象被銷毀。要實(shí)現(xiàn)一些保證對(duì)象徹底被銷毀時(shí)的動(dòng)作,只能依賴于java.lang.ref里面的類和GC交互了。

相關(guān)文章

  • MyEclipse8.6首次運(yùn)行maven項(xiàng)目圖標(biāo)上沒有小M的標(biāo)識(shí)怎么解決

    MyEclipse8.6首次運(yùn)行maven項(xiàng)目圖標(biāo)上沒有小M的標(biāo)識(shí)怎么解決

    myeclipse8.6導(dǎo)入maven項(xiàng)目后識(shí)別為普通java項(xiàng)目,即項(xiàng)目圖標(biāo)上沒有小M的標(biāo)識(shí)。這時(shí)是無(wú)法直接運(yùn)行的,怎么解決這一問(wèn)題呢?下面小編給大家?guī)?lái)了解決方案,需要的朋友參考下吧
    2016-11-11
  • SpringMVC配置與使用詳細(xì)介紹

    SpringMVC配置與使用詳細(xì)介紹

    Spring MVC是一個(gè)基于Java的實(shí)現(xiàn)了MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,通過(guò)把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡(jiǎn)化開發(fā),減少出錯(cuò),方便組內(nèi)配合
    2022-07-07
  • springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)

    springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)

    這篇文章主要介紹了springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java如何防止JS腳本注入代碼實(shí)例

    Java如何防止JS腳本注入代碼實(shí)例

    這篇文章主要介紹了Java如何防止JS腳本注入代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java獲取linux服務(wù)器上的IP操作

    java獲取linux服務(wù)器上的IP操作

    這篇文章主要介紹了java獲取linux服務(wù)器上的IP操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    這篇文章主要介紹了Java中String和StringBuffer及StringBuilder?有什么區(qū)別,String?是?Java?語(yǔ)言非常基礎(chǔ)和重要的類,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    這篇文章主要為大家介紹了java自旋鎖和JVM對(duì)鎖的優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • springBoot中的CORS跨域注解@CrossOrigin詳解

    springBoot中的CORS跨域注解@CrossOrigin詳解

    這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實(shí)現(xiàn)跨域通信,需要的朋友可以參考下
    2023-12-12
  • SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog

    SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog

    binlog用來(lái)實(shí)現(xiàn)主從復(fù)制,也常用來(lái)誤刪數(shù)據(jù)庫(kù)找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對(duì)于提供個(gè)性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下
    2023-11-11

最新評(píng)論