成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM基礎概念總結:數據類型、堆與棧

開發 后端
本文總結了JVM的一些基礎概念,即數據類型以及堆與棧的概念。文中主要總結了堆與棧的關系、區分:堆和棧中,棧是程序運行最根本的東西。程序運行可以沒有堆,但是不能沒有棧。

本文來自和你在一起的博客,原文標題為《JVM調優總結(一)-- 一些概念》。

數據類型

#t#Java虛擬機中,數據類型可以分為兩類:基本類型和引用類型。基本類型的變量保存原始值,即:他代表的值就是數值本身;而引用類型的變量保存引用值。“引用值”代表了某個對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置。

基本類型包括:byte, short, int, long, char, float, double, Boolean, returnAddress

引用類型包括:類類型,接口類型和數組。

堆與棧

堆和棧是程序運行的關鍵,很有必要把他們的關系說清楚。

堆與棧 

棧是運行時的單位,而堆是存儲的單位。

棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;堆解決的是數據存儲的問題,即數據怎么放、放在哪兒。

在Java中一個線程就會相應有一個線程棧與之對應,這點很容易理解,因為不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。而堆則是所有線程共享的。棧因為是運行單位,因此里面存儲的信息都是跟當前線程(或程序)相關信息的。包括局部變量、程序運行狀態、方法返回值等等;而堆只負責存儲對象信息。

為什么要把堆和棧區分出來呢?棧中不是也可以存儲數據嗎?

第一,從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設計的方方面面都有體現。

第二,堆與棧的分離,使得堆中的內容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數據交互方式(如:共享內存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節省了空間。

第三,棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

第四,面向對象就是堆和棧的完美結合。其實,面向對象方式的程序與以前結構化的程序在執行上沒有任何區別。但是,面向對象的引入,使得對待問題的思考方式發生了改變,而更接近于自然方式的思考。當我們把對象拆開,你會發現,對象的屬性其實就是數據,存放在堆中;而對象的行為(方法),就是運行邏輯,放在棧中。我們在編寫對象的時候,其實即編寫了數據結構,也編寫的處理數據的邏輯。不得不承認,面向對象的設計,確實很美。

在Java中,Main函數就是棧的起始點,也是程序的起始點。

程序要運行總是有一個起點的。同C語言一樣,java中的Main就是那個起點。無論什么java程序,找到main就找到了程序執行的入口:)

堆中存什么?棧中存什么?

堆中存的是對象。棧中存的是基本數據類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個對象只對應了一個4btye的引用(堆棧分離的好處:))。

為什么不把基本類型放堆中呢?因為其占用的空間一般是1~8個字節——需要空間比較少,而且因為是基本類型,所以不會出現動態增長的情況——長度固定,因此棧中存儲就夠了,如果把他存在堆中是沒有什么意義的(還會浪費空間,后面說明)。可以這么說,基本類型和對象的引用都是存放在棧中,而且都是幾個字節的一個數,因此在程序運行時,他們的處理方式是統一的。但是基本類型、對象引用和對象本身就有所區別了,因為一個是棧中的數據一個是堆中的數據。最常見的一個問題就是,Java中參數傳遞時的問題。

Java中的參數傳遞時傳值呢?還是傳引用?

要說明這個問題,先要明確兩點:

1. 不要試圖與C進行類比,Java中沒有指針的概念

2. 程序運行永遠都是在棧中進行的,因而參數傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。

明確以上兩點后。Java在方法調用傳遞參數時,因為沒有指針,所以它都是進行傳值調用(這點可以參考C的傳值調用)。因此,很多書里面都說Java是進行傳值調用,這點沒有問題,而且也簡化的C中復雜性。

但是傳引用的錯覺是如何造成的呢?在運行棧中,基本類型和引用的處理是一樣的,都是傳值,所以,如果是傳引用的方法調用,也同時可以理解為“傳引用值”的傳值調用,即引用的處理跟基本類型是完全一樣的。但是當進入被調用方法時,被傳遞的這個引用的值,被程序解釋(或者查找)到堆中的對象,這個時候才對應到真正的對象。如果此時進行修改,修改的是引用對應的對象,而不是引用本身,即:修改的是堆中的數據。所以這個修改是可以保持的了。

對象,從某種意義上說,是由基本類型組成的。可以把一個對象看作為一棵樹,對象的屬性如果還是對象,則還是一顆樹(即非葉子節點),基本類型則為樹的葉子節點。程序參數傳遞時,被傳遞的值本身都是不能進行修改的,但是,如果這個值是一個非葉子節點(即一個對象引用),則可以修改這個節點下面的所有內容。
 
堆和棧中,棧是程序運行最根本的東西。程序運行可以沒有堆,但是不能沒有棧。而堆是為棧進行數據存儲服務,說白了堆就是一塊共享的內存。不過,正是因為堆和棧的分離的思想,才使得Java的垃圾回收成為可能。

Java中,棧的大小通過-Xss來設置,當棧中存儲數據比較多時,需要適當調大這個值,否則會出現java.lang.StackOverflowError異常。常見的出現這個異常的是無法返回的遞歸,因為此時棧中保存的信息都是方法返回的記錄點。

責任編輯:yangsai 來源: JavaEye博客
相關推薦

2010-09-27 08:38:49

JVM堆JVM棧

2010-01-07 14:10:41

VB.NET數據類型

2021-06-15 09:20:08

Redis數據類型

2010-01-14 14:21:07

2009-08-27 10:14:04

LINQ基礎概念

2011-05-23 16:40:00

python

2009-12-03 09:59:20

JVM概念Java對象引用類型

2009-06-08 22:01:03

Java堆Java棧區別

2019-11-12 08:53:32

PG數據數據庫

2010-08-10 17:17:59

2020-05-27 21:13:27

JavaJVM內存

2009-12-21 18:19:19

WCF地址類型

2009-08-13 18:02:50

C#基礎概念

2012-03-16 15:20:43

MySQL

2010-08-11 09:14:33

DB2數據類型

2009-06-24 08:04:18

Hibernate基礎核心接口數據類型

2021-04-05 08:22:54

Python進制數據類型

2021-03-08 09:00:00

Java編程內存

2010-09-25 08:38:57

Java虛擬機

2023-03-27 10:04:27

數據類型浮點型布爾型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久国产精品99 | 玖玖免费 | 成人三级在线观看 | 午夜专区 | 一区二区在线视频 | 久久精品国产一区二区三区不卡 | 操久久| 盗摄精品av一区二区三区 | 国产视频久久 | 午夜影视 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 97精品一区二区 | 91偷拍精品一区二区三区 | 欧美在线综合 | 亚洲精品1区 | www.狠狠干 | 日韩激情免费 | 国产不卡一区 | 欧美 日韩 国产 一区 | 国产精品久久精品 | 成人小视频在线观看 | 成人h片在线观看 | 欧美成人精品一区二区三区 | 99pao成人国产永久免费视频 | 国产免费人成xvideos视频 | 国产精品永久免费视频 | 99精品国产一区二区三区 | h视频免费观看 | 国产精品一区二区三级 | 亚洲视频在线观看 | 91av免费版| 黄色精品视频网站 | 国产视频中文字幕 | 播放一级毛片 | 在线一区观看 | 日韩视频在线播放 | 狠狠干天天干 | 国产在线高清 | 一级黄色毛片子 | 国产精品久久久乱弄 | 91视频91|