java-堆、棧、方法區、直接內存、堆和棧區別

1 堆區:
1.1 存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
1.2 jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
2 棧區:
2.1 每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.2 每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
2.3 棧分爲3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
4 方法區:
4.1 又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
4.2 方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
5 直接內存(深入理解JVM定義)
直接內存並不是虛擬機運行時數據區的一部分,也不是Java 虛擬機規範中農定義的內存區域。在JDK1.4 中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝區(Buffer)的I/O 方式,它可以使用native 函數庫直接分配堆外內存,然後通脫一個存儲在Java堆中的DirectByteBuffer 對象作爲這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因爲避免了在Java堆和Native堆中來回複製數據。
本機直接內存的分配不會受到Java 堆大小的限制,受到本機總內存大小限制
配置虛擬機參數時,不要忽略直接內存 防止出現OutOfMemoryError異常
直接內存(堆外內存)與堆內存比較
直接內存申請空間耗費更高的性能,當頻繁申請到一定量時尤爲明顯
直接內存IO讀寫的性能要優於普通的堆內存,在多次讀寫操作的情況下差異明顯
//非直接內存分配申請
ByteBuffer buffer = ByteBuffer.allocate(2);
//直接內存分配申請
ByteBuffer buffer = ByteBuffer.allocateDirect(2);
6 結構圖如下
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章