1. 程式人生 > >淺析Java記憶體和建立物件時成員的初始化過程

淺析Java記憶體和建立物件時成員的初始化過程

Java虛擬機器在執行需要在記憶體中開闢空間,在空間中進一步分割槽,每個分割槽都有其對資料的處理特點,
記憶體的劃分:
1、暫存器: CPU在處理,儲存速度非常快,程式不可控制
2、本地方法區:和所在系統相關

3、方法區:

存放程式中所需類的位元組碼資訊和static定義的靜態成員
4、棧記憶體:
儲存的都是區域性變數,棧中變數沒有預設初始化,變數所屬區域一旦結束,該變數就立即自動釋放(記憶體釋放),生命週期
都比較短,速度快。
棧中的資料可以共享(和堆中的常量池中的共享效果是一樣的)。
5、堆記憶體(堆記憶體中含有一個常量池): 
存放動態產生的資料,比如是物件,凡是new建立的都在堆中。 沒有引用則視為垃圾,並不一定會立即釋放記憶體,java有垃圾
處理機制。
特點:1、每一個實體都有首地址值。
2、堆記憶體中的每一個變數都有預設初始化值,根據型別的不同而不同。char預設初始化'\u0000'
3、釋放方式是垃圾回收機制。
-->常量池:jvm為每一個已經載入的類維護一個常量池,常量池就是這個型別用到的常量的一個有序集合,包括直接常量和
對其他型別、方法、欄位的符號引用。此型別實現了常量池技術才可以在常量池中存放資料,八種基本資料型別中除去doubel
型別和float型別沒有實現常量池技術,其餘的全部實現,但是針對六種基本型別,常量池可提供其共享的範圍是[-128,127],
常量如果超過了這個範圍,就要在堆中建立物件,不進入常量池。
注意:1)、類的成員變數在不同物件中各不相同,都有自己的儲存空間(所屬物件)(成員變數在堆中的物件中)。而類的方法卻是該類的
所有物件共享的,只有一套,物件使用方法時方法才被壓入棧,方法不使用不佔用記憶體。

     2)、引用資料型別儲存的是引用,例項是在堆記憶體中;基本資料型別存放的是資料值本身。Java中是“值傳遞”,只不過這個值可能是數
據值也可能是引用值。


當建立一個物件的時候,記憶體都做了什麼操作:
    1、在程式進行編譯時期,是將程式程式碼編譯成位元組碼資訊
    2、首先通過類裝載器載入類檔案的位元組碼資訊,經過解析後將其裝入方法區,類的各種資訊都在方法區中儲存著。
    3、載入類資訊的時候,若所在類有靜態程式碼塊static{},則會隨著類的載入而被執行,在程式啟動到結束這個過程
        中,類只被載入以此,靜態程式碼塊也只執行一次。(當存在繼承時,會先執行父類操作)
    4、當使用關鍵字new建立一個類的例項時,jvm就會在堆記憶體中開闢一個空間。
    5、建立物件時,物件的成員首先是進行預設初始化。
    6、而後成員進行顯示初始化。
    7,成員進行構造程式碼塊的初始化。
    8,最後成員是建構函式的初始化。new的作用是建立物件,而建構函式的作用是初始化物件。

相關推薦

淺析Java記憶體建立物件成員初始過程

Java虛擬機器在執行需要在記憶體中開闢空間,在空間中進一步分割槽,每個分割槽都有其對資料的處理特點, 記憶體的劃分:1、暫存器: CPU在處理,儲存速度非常快,程式不可控制2、本地方法區:和所在系統相關3、方法區: 存放程式中所需類的位元組碼資訊和static定義的靜態成

從一個例項看java,new一個物件初始順序

例子如下: package com.zhiru; class ADemo { private static int id; static { id = 0; System.out.pri

阿里巴巴Java開發手冊建議建立HashMap設定初始容量,但是多少合適呢?

集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的資料結構,HashMap對於Java開發者一定不陌生。 關於HashMap,很多人都對他有一些基本的瞭解,比如他和hashtable之間的區別、他和concurrentHashMap之間的區別等。這些都是比較常見的,關於HashMap的一

Java筆記丨18 物件構造與初始

構造方法 物件都有構造方法 如果沒有,編譯器加一個default構造方法 思考 抽象類有沒有構造方法?(有)   呼叫本類或父類的構造方法 this呼叫本類的其他構造方法 super呼叫直接父類的構造方法 this或super要放在第一條語句,且只能夠有

-1-2 java 面向物件基本概念 封裝繼承多型 變數 this super static 靜態變數 匿名物件 值傳遞 初始化過程 程式碼塊 final關鍵字 抽象類 介面 區別 多型 包 訪問許可權 內部類 匿名內部類 == 與 equal

java是純粹的面向物件的語言 也就是萬事萬物皆是物件 程式是物件的集合,他們通過傳送訊息來相互通訊 每個物件都有自己的由其他的物件所構建的儲存,也就是物件可以包含物件 每個物件都有它的型別  也就是類 某一特定型別的所有物件都可以接收相同的訊息,因為同一類事物有共同的特性 面向物件開發 •

java建立物件,new 出一個物件 = null的區別

首先要明白,java裡物件傳遞的時候,傳遞的都是引用(也就是物件的地址),這比傳遞整個物件高效的多。而基礎型別,int,double等傳遞的才是值。比如,(new ArrayList<String>).add(new String("hello")),jvm只是把

建立物件,=null new的區別

1.=null只是宣告一個物件,並不實際佔用空間。 如:HBPWDto hbpwDto = null; 相當於HBPWDto hbpwDto ; 2.new,把物件例項化了,這個物件會一直佔用空間(雖然不一定使用),直到被回收。 如果只是做賦值操作,只需要宣告就行了 ,在需要的時候再賦予

java基礎———類與物件成員變數區域性變數,封裝及關鍵字staticthis

類與物件,成員變數和區域性變數,封裝及關鍵字static和this 面向物件的思想 類與物件及其應用 物件的記憶體圖 成員變數和區域性變數的區別 匿名物件 封裝(private) this關鍵字 構造方法 物件的建立步驟

java 利用反射建立執行類的物件

java 利用反射建立執行時類的物件 1. java 利用反射建立執行時類的物件 1.1. 建立類的物件:呼叫Class物件的newInstance()方法 2.例子demo 3. 反

建立全域性區域性物件,不同的建構函式和解構函式的呼叫順序

#include<iostream> using namespace std; void create(); class base{ int data; public: base(int i) { data=i; cout<<"CONS:"<&l

Java記憶體區域(執行資料區域)記憶體模型(JMM)

Java 記憶體區域和記憶體模型是不一樣的東西,記憶體區域是指 Jvm 執行時將資料分割槽域儲存,強調對記憶體空間的劃分。 而記憶體模型(Java Memory Model,簡稱 JMM )是定義了執行緒和主記憶體之間的抽象關係,即 JMM 定義了 JVM 在計算機記憶體(RAM)中的工作方式,如果我們要想深

Java記憶體區域(執行資料區域)記憶體模型

    而記憶體模型(Java Memory Model,簡稱 JMM )是定義了執行緒和主記憶體之間的抽象關係,即 JMM 定義了 JVM 在計算機記憶體(RAM)中的工作方式,如果我們要想深入瞭解Java併發程式設計,就要先理解好Java記憶體模型。 Jav

Java類的各種成員初始順序如:父子類繼承的靜態代碼塊,普通代碼塊,靜態方法,構造方法,等先後順

依次 成員初始化順序 main class 實例對象 變量 影響 {} 所在 class B extends A ,然後A類也就是父類裏面有靜態代碼塊,普通代碼塊,靜態方法,靜態成員變量,普通成員變量,普通方法。子類也是這樣,然後繼承之後,關於程序打印輸出的結果。涉及到Ja

垃圾回收機制(GC) Java記憶體區域及物件

前言   上一篇文章Java記憶體區域及物件講述了Java記憶體執行時的各個部分,其中程式計數器、虛擬機器棧、本地方法棧3個區域隨執行緒生而生,隨執行緒滅而滅,在這幾個區域是不需要過多的考慮回收的問題的,因為方法結束或者執行緒結束時,記憶體自然就跟隨著回收了;而Java堆和方法區則不一樣,一個介面中的多個實

Python面向物件(定義類建立物件)

day24 http://www.cnblogs.com/wupeiqi/p/4493506.html Python:函式式+面向物件,函數語言程式設計可以做所有事,但是不一定合適。 小明,10歲,男,上山去砍柴 小明,10歲,男,開車去東北 老李,90歲,男,上山去砍柴 老李,

Java解析建立JSON

  轉自:https://segmentfault.com/a/1190000003089746   JSON概述 JSON即javascript object notation,是javascript物件表示法的子集。具有以下特點: 資料放在鍵值對中;

建立物件......

"程式設計師要建立物件了,快去西天請Spring'佛祖'。"  一大早我就聽到Tomcat在那裡大喊。 “不就是建立一個物件嗎,你給JVM老大打個電話,請他在堆裡邊new出來不就結了?無非就是一片兒記憶體而已。”我問道。 “唉,你不知道,這不僅僅是物件的建立,更是物件的裝配,要依賴

淺析java記憶體模型--JMM

在併發程式設計中,多個執行緒之間採取什麼機制進行通訊(資訊交換),什麼機制進行資料的同步? 在Java語言中,採用的是共享記憶體模型來實現多執行緒之間的資訊交換和資料同步的。 執行緒之間通過共享程式公共的狀態,通過讀-寫記憶體中公共狀態的方式來進行隱式的通訊。同步指的是程式在控制多個執行緒之

Java記憶體模型與物件揭祕

看了很多個關於Java記憶體模型的部落格,這篇部落格有著獨到的見解. 前言:最近看了《深入jvm》一書,感受頗深,但是不寫點什麼總感覺不是自己的,所以動手捋一捋。主要講的內容是java的記憶體區域,物件的建立,物件的記憶體佈局和物件的訪問方式。 一、java的記憶體區域劃

如何定義類建立物件

【10】類定義和物件建立 類,定義了一個功能模組。 10-1 成員變數:描述物件的屬性。 10-2 成員方法:描述物件的行為。 package bike; /* * 類定義和物件建立 */ public class bike { String color=