導航:首頁 > 安裝方法 > 本地方法創建的對象存在哪裡

本地方法創建的對象存在哪裡

發布時間:2022-08-03 07:05:44

1. java中,靜態方法被調用是,存儲在內存的哪個區域是棧還是放大區還是兩者都有

在JDK8之前,靜態成員(靜態變數和靜態方法)都是存儲在方法區(永久代)中的靜態區中(這里指類被載入後,靜態成員的存儲位置)。但在JDK8之後,永久代被移除了,取而代之的是元空間(metaspace)。但元空間中存儲的主要是.class文件的元數據信息,靜態成員的存儲位置由方法區轉到了堆內存(heap)中。
不過,不管是JDK8,還是更早的版本中,靜態方法的執行(不僅僅是靜態方法,還有普通的成員方法)都是在棧內存(stack)中進行的。每個線程都會在棧內存中開辟一個棧,在調用方法時,對應的方法都會在執行這個方法的線程的棧中創建一個「棧幀」,棧幀中保存了局部變數表(基本數據類型和對象引用)、操作數棧、動態連接和返回地址等信息。等到方法執行完畢,棧幀被銷毀,對應的內存也將被釋放。

2. java的方法中new的對象存儲在內存中那個區域

這個對象存在堆中,還是棧中?
答:堆,new一個對象,一定是在堆中
方法內部new出來的對象,在哪裡存著?
答:堆,new出來對象的實例變數都存在堆上面。

棧,這個東西,需要理解為:線程運行時,才會創建,執行完,就沒了。
Person p = new Person();
上面這段代碼,在執行時,p壓入棧,通過局部變數表,找到對應的【實例數據】,執行完畢後釋放。

3. JAVA中類中的方法存儲在什麼地方

類載入時 方法信息保存在一塊稱為方法區的內存中, 並不隨你創建對象而隨對象保存於堆中。可參考《深入java虛擬機》前幾章。
另參考(他人文章):
如果instance method也隨著instance增加而增加的話,那內存消耗也太大了,為了做到共用一小段內存,Java 是根據this關鍵字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在傳遞給對象參數的時候,Java 編譯器自動先加上了一個this參數,它表示傳遞的是這個對象引用,雖然他們兩個對象共用一個方法,但是他們的方法中所產生的數據是私有的,這是因為參數被傳進來變成call stack內的entry,而各個對象都有不同call stack,所以不會混淆。其實調用每個非static方法時,Java 編譯器都會自動的先加上當前調用此方法對象的參數,有時候在一個方法調用另一個方法,這時可以不用在前面加上this的,因為要傳遞的對象參數就是當前執行這個方法的對象。

4. 關於JAVA String字元串。

ava字元串類(java.lang.String)是Java中使用最多的類,也是最為特殊的一個類,很多時候,我們對它既熟悉又陌生。
一、從根本上認識java.lang.String類和String池
首先,我建議先看看String類的源碼實現,這是從本質上認識String類的根本出發點。從中可以看到:
1、String類是final的,不可被繼承。public final class String。
2、String類是的本質是字元數組char[], 並且其值不可改變。private final char value[];
然後打開String類的API文檔,可以發現:
3、String類對象有個特殊的創建的方式,就是直接指定比如String x = "abc","abc"就表示一個字元串對象。而x是"abc"對象的地址,也叫
做"abc"對象的引用。
4、String對象可以通過「+」串聯。串聯後會生成新的字元串。也可以通過concat()來串聯,這個後面會講述。
6、Java運行時會維護一個String Pool(String池),JavaDoc翻譯很模糊「字元串緩沖區」。String池用來存放運行時中產生的各種字元串,
並且池中的字元串的內容不重復。而一般對象不存在這個緩沖池,並且創建的對象僅僅存在於方法的堆棧區。
5、創建字元串的方式很多,歸納起來有三類:
其一,使用new關鍵字創建字元串,比如String s1 = new String("abc");
其二,直接指定。比如String s2 = "abc";
其三,使用串聯生成新的字元串。比如String s3 = "ab" + "c";
二、String對象的創建
String對象的創建也很講究,關鍵是要明白其原理。
原理1:當使用任何方式來創建一個字元串對象s時,Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字元串對象,
如果不存在,則在池中創建一個字元串s,否則,不在池中添加。
原理2:Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。
原理3:使用直接指定或者使用純字元串串聯來創建String對象,則僅僅會檢查維護String池中的字元串,池中沒有就在池中創建一個,有則罷
了!但絕不會在堆棧區再去創建該String對象。
原理4:使用包含變數的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。
另外,String的intern()方法是一個本地方法,定義為public native String intern(); intern()方法的價值在於讓開發者能將注意力集中到
String池上。當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字元串(該對象由 equals(Object) 方法確定),則返回池
中的字元串。否則,將此 String 對象添加到池中,並且返回此 String 對象的引用。
三、不可變類
不可改變的字元串具有一個很大的優點:編譯器可以把字元串設置為共享。
不可變類String有一個重要的優點-它們不會被共享引用。
是這樣的,JAVA為了提高效率,所以對於String類型進行了特別的處理---為string類型提供了串池
定義一個string類型的變數有兩種方式:
string name= "tom ";
string name =new string( "tom ")
使用第一種方式的時候,就使用了串池,
使用第二中方式的時候,就是一種普通的聲明對象的方式
如果你使用了第一種方式,那麼當你在聲明一個內容也是 "tom "的string時,它將使用串池裡原來的那個內存,而不會重新分配內存,也就是說,string saname= "tom ",將會指向同一塊內存
另外關於string類型是不可改變的問題:
string類型是不可改變的,也就是說,當你想改變一個string對象的時候,比如name= "madding "
那麼虛擬機不會改變原來的對象,而是生成一個新的string對象,然後讓name去指向它,如果原來的那個 "tom "沒有任何對象去引用它,虛擬機的垃圾回收機制將接收它。
據說這樣可以提高效率!!!

5. Java棧和本地方法棧方法調用棧,這些都是什麼

JAVA內存裡面有一般有四個分類,堆, 棧(堆棧), 靜態域, 常量池

棧: 實際上是一個隊列, 遵循 FILO的原則(後進先出), 裡面儲存的是函數的參數值,局部變數,對象的引用(對象本身不在這里)等,因此在每調用一個函數時,堆棧都會分配一部分空間給它,函數返回時,被釋放
堆: 儲存靜態變數,全局變數 和 用new創建的東西,棧中的內存是動態內存,其中的內存在不使用時隨時可以被回收
靜態域:存放對象中static定義的成員
常量池:存放常量
根據以上解釋回答你的問題:
JAVA棧存的是函數的參數值,局部變數,對象的引用
方法調用棧? 沒有這說法吧, 方法的調用是存在棧中的
本地方法棧, 和JAVA中的棧一個作用, 只是這個棧是屬於本地的,不屬於JAVA虛擬機,但受JAVA虛擬機的控制,因為是JAVA虛擬機簡單地動態鏈接並直接調用指定的本地方法。可以把這看作是虛擬機利用本地方法來動態擴展自己
局部變數和對象引用存在 棧 中, 方法調用的棧幀也是在 棧 中
以上是我自己查資料+自己的理解,有錯望指出

6. 在java中本地方法是什麼意思

就是用關鍵字native修飾的方法,通過這些方法可以調用java以外的程序,例如c語言寫的程序

7. java中的對象是存在哪裡

比如 String bb= new String ();new出來的對象放在堆內存中了,bb這個是局部變數放在棧內存

8. java中的方法代碼存在了哪裡

類的實例方法在內存中是只有一份,不過肯定不會是第一個對象中,如果是第一個對象的話,那麼當第一個對象被銷毀的時候,那麼後面的對象就永遠無法調用了...
類的實例方法存在一個專門的區叫方法區,事實上類剛裝載的時候就被裝載好了,不過它們在"睡眠",只是這些方法必須當有對象產生的時候才會"蘇醒".(比如,一個輸出類的成員變數的方法,如果連對象都沒有,何來的輸出成員變數).所以,方法在裝載的時候就有了,但是不可用,因為它沒有指象任何一個對象。

而靜態的又不一樣了,靜態的東西存在靜態區,他們和類是一個等級的,就是說只要類被裝載,它們就可以直接用.(用類名來調用).他們不依賴與任何對象,所以也不能輸出任何對象的成員屬性.(除非成員屬性也是靜態的).

而你最後的一句話也是錯的,"類的所有數據在內存中只有靜態的才又空間".
當然不是,每個對象在new的時候都會在堆區中開辟內存,用來保存對象的屬性和方法.(實際上方法保存的只是方法區的引用,如果保存的是方法本身,那麼試想一下,有多少個對象就得有多少個方法,那麼又和第一點中"實例方法在內存中只有一份拷貝"相矛盾了)

好了,事實上內存圖很復雜和麻煩,算比較深的東西了,很多用JAVA多年的人也不太了解其原理,因為開發也不要用..

更多的問題可以去遠標培訓去問技術老師。

閱讀全文

與本地方法創建的對象存在哪裡相關的資料

熱點內容
馬原中歸納的方法有什麼局限性 瀏覽:508
燈具遙控安裝方法 瀏覽:984
在家地震預警有哪些方法論 瀏覽:398
氣缸圓柱度的檢測方法 瀏覽:214
東風制動燈故障原因和解決方法 瀏覽:309
簡諧運動研究方法 瀏覽:123
幼兒異物吸入的搶救方法有哪些 瀏覽:210
開衫毛衣尺寸的經典計算方法 瀏覽:356
廣電有線連接方法 瀏覽:826
局解血管的檢查常用方法 瀏覽:987
瑜伽的技巧和方法 瀏覽:833
寫出五種植物的傳播方法 瀏覽:97
治療脾氣差的最佳方法 瀏覽:814
花卉滿天星的種植方法 瀏覽:966
風控未通檢測方法 瀏覽:767
根管治療術的步驟和方法 瀏覽:180
去腳臭的簡單的方法 瀏覽:934
二年級語文教學方法和教學手段 瀏覽:68
學前教育研究方法課題 瀏覽:866
瑜伽胳膊鍛煉方法 瀏覽:124