java 内存类_Java学习——类的生命周期和内存
常識是本能,有足夠的常識便是天才。——肖伯納
一、類的生命周期
類的生命周期:1.加載:將二進制流加載進來.class
2.連接:
驗證:確保加載進來的數據不會損害虛擬機
準備:為類變量分配內存,附默認值
解析:符號引用轉化為直接引用3.初始化:將靜態信息賦值
靜態代碼塊在類初始化時執行,類初始化只初始化一次
4.對象實例化:
4種方法:
new()創建
clone()創建,需要類實現 Cloneable 接口
通過反射機制創建
將一個對象實例化后,進行序列化,再反序列化
創建對象的過程:
Student s1=new Student();
1.加載類
2.在堆中為對象分配一塊內存
3.為各個屬性賦默認值
4.為各個屬性附具體的值
5.執行構造塊
6.執行構造器
7.s1與對象連接上
5.垃圾收集(GC):
發現無用信息對象;
回收被無用對象占用的內存空間,使該空間可被程序再次使用。
finalize():垃圾回收前做一些重要工作
System.gc():啟動一個垃圾回收器,但是java語言規范并不保證GC一定會執行
6.卸載:
當類對象不再被引用,對象就會結束生命周期,類在方法區內的數據也會被卸載, 從而結束類的聲明周期。
這里著重看一下類的初始化:
靜態代碼塊(類加載時就執行)
初始化塊(類對象創建后,就執行)
構造方法(創建相對應類對象·,就執行)
實踐代碼,搓搓小手動起來(=!=):
public class ChuShiHua {
int c;
static int a=10;//靜態屬性
//靜態代碼塊(類加載時就執行)
static {
System.out.println("hello"+a);//hello10
a++;
}
static int b=9;
//初始化塊(類對象創建后,就執行)
{
System.out.println("b++:"+ b++);
System.out.println("b:"+b);
System.out.println("++b:" + ++b);
System.out.println("d:"+d);
}
static int d=11;
//無參構造方法(創建無參類對象·,就執行)
public ChuShiHua(){
System.out.println("c+a :" + c+a);
}
//主函數
public static void main(String[] args) {
System.out.println("ChuShiHua.a :"+ ChuShiHua.a);
ChuShiHua t1=new ChuShiHua();
}
}
輸出結果圖片:
二、內存
不管你是要創建變量還是對象在內存里面都會開辟內存空間。
JVM的內存可分為:堆(heap)、虛擬機棧(stack)和方法區(靜態區),程序計數器,本地方法棧堆:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息(class的目的是得到操作指令)
2.jvm只有一個堆區(heap),且被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身和數組本身;
虛擬機棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型本身和自定義對象的引用;
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問;
3.棧分為3個部分:局部變量表、執行環境上下文、操作指令區(存放操作指令);
方法區(靜態區):
被所有的線程共享,方法區包含對Class的引用,
類變量,常量,方法。常量池和運行時常量池。
本地方法棧:
功能與虛擬機棧類似,不過虛擬機棧是為java服務的,而本地方法棧是為native方法服務的。
程序計數器:
記錄的是當前線程所執行的字節碼的行號指示器。
不管你是要創建變量還是對象在內存里面都會開辟內存空間
他們之間的關聯是通過內存地址進行關聯的
變量:
int a = 10;
1.為變量a在棧區開辟一個內存空間
2.將常量10存放在常量池中并創建內存地址0x0031
3.將常量10的內存地址賦值給變量a的內存空間
4.變量a指向常量10
如下圖:
對象:
Student s = new Student();
1.將Student.class文件加載進內存
2.為變量a在棧中開辟一個內存空間
3.為對象在堆中開辟內存空間并分配內存地址
4.將屬性放到堆中,并進行默認初始化
5.調用對應的構造方法進行對象初始化,并初始化完畢
6.將對象的內存地址賦值給a,讓變量a指向對象
如下圖:
今天學習分享的內容到此為止了,本是想要激勵自己學下去,但發現快樂更是知識在于分享!
作為初學者對于Java的理解實在淺薄,如有錯誤請指正,萬分感謝!
總結
以上是生活随笔為你收集整理的java 内存类_Java学习——类的生命周期和内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: access根据所属院系修改学号_五个a
- 下一篇: java中运算类型_Java数据类型及运