當前位置:首頁 » 編程語言 » java內存共享

java內存共享

發布時間: 2022-04-29 06:45:11

A. java共享內存的問題,如何存,取共享數據

1 共享內存對應應用開發的意義
對熟知UNIX系統應用開發的程序員來說,IPC(InterProcess
Communication)機制是非常熟悉的,IPC基本包括共享內存、信號燈操作、消息隊列、信號處理等部分,是開發應用中非常重要的必不可少的工具。其中共享內存IPC機制的關鍵,對於數據共享、系統快速查詢、動態配置、減少資源耗費等均有獨到的優點。

對應UNIX系統來說,共享內存分為一般共享內存和映像文件共享內存兩種,而對應 Windows,實際上只有映像文件共享內存一種。所以java應用中也是只能創建映像文件共享內存。

在java語言中,基本上沒有提及共享內存這個概念,但是,在某一些應用中,共享內存確實非常有用,例如採用java語言的分布式應用系統中,存在著大量的分布式共享對象,很多時候需要查詢這些對象的狀態,以查看系統是否運行正常或者了解這些對象的目前的一些統計數據和狀態。如果採用網路通信的方式,顯然會增加應用的額外負擔,也增加了一些不必要的應用編程。而如果採用共享內存的方式,則可以直接通過共享內存查看對象的狀態數據和統計數據,從而減少了一些不必要的麻煩。

B. java堆內存被所有線程所共享,不明白2個線程如何共享2個對象中的同名變數。

首先:堆內存共享是相對於棧內存的。棧是每一個線程都獨有的,線程之間互不一向,每一個線程都有自己的棧內存。但是堆內存不一樣,在一個JVM實例裡面,不管你有多少線程,創建了多少對象,都是放在一塊堆內存的。也就是說一個JVM實例棧內存區域是有多個,每一個線程持有一個,而堆內存只有一個,是線程共享的。
其次:針對你這個代碼,這個情況下每一個線程確實是對應著不同的對象。也就是在同一個堆(也只有一個堆)裡面創建了兩個Demo對象。你老師的意思應該是
Demo demo = new demo();
Thread S1=new Thread(demo);
Thread S2=new Thread(demo);
這樣兩個線程都是操作堆內存共享的對象。

C. 簡述java內存分配與回收策率有什麼用

引言:大多數情況下,對象在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機將發起一次Minor GC。新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。老年代GC(Major GC / Full GC):指發生在老年代的GC,出現了Major GC,經常會伴有至少一次的Minor GC(但非絕對的,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上。


三、總結

可達性分析:以名為“GC根”的對象為起點,從這些節點向下搜索。當一個對象不能連接到“垃圾回收根”時,意味著它是可回收的。

D. 怎樣用java實現內存動態分配

1、java是如何管理內存的

Java的內存管理就是對象的分配和釋放問題。(兩部分)
分配 :內存的分配是由程序完成的,程序員需要通過關鍵字new 為每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。
釋放 :對象的釋放是由垃圾回收機制決定和執行的,這樣做確實簡化了程序員的工作。但同時,它也加重了JVM的工作。因為,GC為了能夠正確釋放對象,GC必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都需要進行監控。
2、 JVM的內存區域組成
java把內存分兩種:一種是棧內存,另一種是堆內存1。在函數中定義的基本類型變數和對象的引用變數都在函數的棧內存中分配;2。堆內存用來存放由new創建的對象和數組以及對象的實例變數 在函數(代碼塊)中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為該變數所分配的內存空間;在堆中分配的內存由java虛擬機的自動垃圾回收器來管理
堆和棧的優缺點
堆的優勢是可以動態分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的。
缺點就是要在運行時動態分配內存,存取速度較慢; 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。
另外,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。

E. java中不同的工程怎麼樣才能共享同一塊內存

棧內存你可以想像成電腦的內存,堆內存你可以看成硬碟,
Java的內存分配上,主要分4個塊!
一塊是用來裝代碼的,就是編譯的東西。
一塊是用來裝靜態變數的,例如用static關鍵字的變數,例如字元串常量。
一塊是stack,也就是棧,是用來裝變數和引用類型的!但區別在於,裝了變數以後,變數上是有值的,而引用類型本身在stack上是沒有值的。
一塊是heap,也就是堆!堆可以一句話概括,裝new出來的東西!
所以綜上所述,基本數據類型都在stack中,而引用類型,變數是放在stack中,真正有內容的東西放在heap中,也就是當new了一個新的引用類型,他就會放在堆中,同時棧中的引用類型變數會指向堆中你new出來的東西!
這樣說希望能幫你了解到java的內存分配問題。

F. java里內存是不是有共享數據說法,那真實的物理內存是不是沒有共享

1.java里共享數據是由jvm控制的,為的是節省內存,提高效率;
2.真實的物理內存里,一般情況下,數據都是獨立存儲的;
3.系統層面一般是不會採用這種共享數據的方法的。
4.Java語言中數據類型包含基本類型和引用類型,你所說的ab是int型,int是java的基礎數據類型,基礎數據類型沒有對象的說法;
5.對於引用類型如:String,舉個例子String strA = new String("CQUT");這里,通過new操作符創建了一個對象,"CQUT"叫對象,strA是引用,類似於c的指針。

G. Java對象的內存分配

棧內存放引用型變數,指向堆裡面new出來的對象

堆內存放new出來的對象

方法只有一份用來共享,只有在執行的時候才在內存中分配空間,如圖:

H. Java中非靜態方法是否共用同一塊內存

答案是不會,我們用field表示欄位,用method表示方法,那麼加上static區分後就 有四種:
class field:有用static修飾的field
class method:有用static修飾的method
instance field:沒有用static修飾的field
instance method:沒有用static修飾的method
那麼他們在內存中的表示為:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨著每個instance各有一塊記憶體
instance method:共用一塊記憶體
如果instance method也隨著instance增加而增加的話,那內存消耗也太大了,為了做到共用一小段內存,Java是根據this關鍵字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在傳遞給對象參數的時候,Java編譯器自動先加上了一個this參數,它表示傳遞的是這個對象引用,雖然他們兩個對象共用一個方法,但是他們的方法中所產生的數據是私有的,這是因為參數被傳進來變成call stack內的entry,而各個對象都有不同call
stack,所以不會混淆。其實調用每個非static方法時,Java編譯器都會自動的先加上當前調用此方法對象的參數,有時候在一個方法調用另一個方法,這時可以不用在前面加上this的,因為要傳遞的對象參數就是當前執行這個方法的對象。
為什麼靜態方法中不能調用非靜態方法?這是因為靜態方法直接跟class相關,調用此方法的時候是類直接調用的,而不是對象,所以Java編譯器就沒有對象參數可以傳遞,這樣,如果你在靜態方法內部調用非靜態方法,那麼Java編譯器怎麼判斷這個非靜態方法是哪個對象調用的?對吧,所以Java編譯器就會報錯,但是也不是絕對的,Java編譯器是隱式的傳遞對象參數,那麼我們總可以顯示的傳遞對象參數吧,如果我們把某個對象的引用傳遞到static方法里,然後通過這個引用就可以調用非靜態方法和訪問非靜態數據成員了。
也是一樣的,方法都屬於類數據,類數據都放在方法區中,《深入java虛擬機》有一個虛擬機的體系結構,在那裡你可以看到線程都放在java棧里,棧幀代表一個方法的返回狀態,執行完一個方法就會彈出這個棧幀,方法區和堆中的數據時所有線程都共享的,所以這里沒有線程的區分。

I. java可以和c++共享內存文件嗎

當然是可以共享的。
你可以在自己的電腦上同時安裝C++和java,然後讓他們分別運行自己的項目就知道了。
他們是可以一起運行的。

J. Java 變數是否共用內存的問題

首先,回答你的第一問。一個類,如果有成員域,沒有針對於每個成員寫set()方法的時候,那麼,如果該成員為簡單數據類型,改變成員的方法,就是重新賦值。如果成員都為引用,那麼,改變成員的原理就是使這個引用指向另一塊堆內存,這也就相當於String類型的引用,要改變這個引用,就是使這個引用指向另一個對象,原理是一樣。
p1,p2指向同一塊類存的時候,修改p1,是不會影響p2的,因為p1,知識個引用,如果你修改那塊內存中的數據的話,那麼對p1,p2都會有影響。打個比方吧,如果兩個小朋友都要去學校,這兩個小朋友就是p1,p2,學校就相當於是那一塊內存。現在你要修改p1,也就是類似於,p1這個小朋友不去學校了,要去超市了,而p1要去哪裡,不會影響p2去學校。而,如果你把學校內容給換了,在學校裡面開商店,把學校改裝成了超市,那麼,兩個小朋友p1,p2還以為學校沒有變,結果,都往學校去了,到了學校一看,才知道他們去了超市。
你這個例子,有點特殊,設計的內容不是一點點。我盡量細得給你講講吧。
Integer p1 = a;這種賦值方法,從JDK1.5以後出現的新特性,在這之前給包裝類賦值的方法都是 Integer p1 = new Integer(a);而jdk1.5後出現了自動裝箱的功能,將一個基本數據類型包裝成一個包裝類,並且包裝類能夠進行和基本數據類型進行直接計算,如 Integer x = 4; x = x+3; 這里第二句運算的原理,牽涉到一個包裝類自動拆箱的原理,在JVM中,實際上是調用了 x.intvalue()這個方法。注意這里x不能為空,因為x為null是合法的,但是一旦為null就不能直接和數值進行計算。
現在解釋一下,為什麼a在[-128,127]之間,p1==p2為true,而超出這個范圍就是false:[-128,127]是byte的范圍,而這個范圍的數值是一直存在內存中的,所以,在建立新對象的時候,發現內存中有數據,則直接讓該包裝類引用指向這塊類存,所以,在建立p1,p2的時候,發現類存中有a這個值,所以,p1,p2都指向這同一塊內存。而當數值超出這個范圍的時候,就重新開辟空間,不管之前是否有對象有這個值,都會開辟新的空間,所以,超出這個范圍,p1==p2就為false了,因為他們指向的內存地址不同。
花了半小時組織語言給你解答,希望採納哈~~ 如果有不懂得,再追問!

熱點內容
我的世界pe伺服器創造 發布:2025-05-15 10:51:17 瀏覽:607
移動端打吃雞要什麼配置 發布:2025-05-15 10:48:16 瀏覽:756
我的世界哪五個伺服器被炸了 發布:2025-05-15 10:36:16 瀏覽:994
ehcache存儲對象 發布:2025-05-15 10:35:31 瀏覽:528
搭建虛擬電腦的伺服器 發布:2025-05-15 10:29:31 瀏覽:270
湖人雙核配置哪個最好 發布:2025-05-15 10:09:48 瀏覽:980
手機熱點密碼怎麼查看 發布:2025-05-15 09:54:47 瀏覽:109
生意發力雲存儲 發布:2025-05-15 09:54:45 瀏覽:617
編寫一個shell腳本添加用戶 發布:2025-05-15 09:54:43 瀏覽:506
資料庫查看錶命令 發布:2025-05-15 09:52:27 瀏覽:915