静态变量加载时间,静态代码块加载时间
生活随笔
收集整理的這篇文章主要介紹了
静态变量加载时间,静态代码块加载时间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
當類加載器將類加載到JVM中的時候就會創建靜態變量,這跟對象是否創建無關。靜態變量加載的時候就會分配內存空間。靜態代碼塊的代碼只會在類第一次初始化的時候執行一次。一個類可以有多個靜態代碼塊,它并不是類的成員,也沒有返回值,并且不能直接調用。靜態代碼塊不能包含this或者super,它們通常被用初始化靜態變量。
通過一個小程序認識JVM
package com.spark.jvm; /*** 從JVM調用的角度分析java程序堆內存空間的使用:* 當JVM進程啟動的時候,會從類加載路徑中找到包含main方法的入口類HelloJVM* 找到HelloJVM會直接讀取該文件中的二進制數據,并且把該類的信息放到運行時的Method內存區域中。* 然后會定位到HelloJVM中的main方法的字節碼中,并開始執行Main方法中的指令* 此時會創建Student實例對象,并且使用student來引用該對象(或者說給該對象命名),其內幕如下:* 第一步:JVM會直接到Method區域中去查找Student類的信息,此時發現沒有Student類,就通過類加載器加載該Student類文件;* 第二步:在JVM的Method區域中加載并找到了Student類之后會在Heap區域中為Student實例對象分配內存,* 并且在Student的實例對象中持有指向方法區域中的Student類的引用(內存地址);* 第三步:JVM實例化完成后會在當前線程中為Stack中的reference建立實際的應用關系,此時會賦值給student* 接下來就是調用方法* 在JVM中方法的調用一定是屬于線程的行為,也就是說方法調用本身會發生在線程的方法調用棧:* 線程的方法調用棧(Method Stack Frames),每一個方法的調用就是方法調用棧中的一個Frame,* 該Frame包含了方法的參數,局部變量,臨時數據等 student.sayHello();*/ public class HelloJVM {//在JVM運行的時候會通過反射的方式到Method區域找到入口方法mainpublic static void main(String[] args) {//main方法也是放在Method方法區域中的/*** student(小寫的)是放在主線程中的Stack區域中的* Student對象實例是放在所有線程共享的Heap區域中的*/Student student = new Student("spark");/*** 首先會通過student指針(或句柄)(指針就直接指向堆中的對象,句柄表明有一個中間的,student指向句柄,句柄指向對象)* 找Student對象,當找到該對象后會通過對象內部指向方法區域中的指針來調用具體的方法去執行任務*/student.sayHello();} }class Student {// name本身作為成員是放在stack區域的但是name指向的String對象是放在Heap中private String name;public Student(String name) {this.name = name;}//sayHello這個方法是放在方法區中的public void sayHello() {System.out.println("Hello, this is " + this.name);} }具體JVM 架構圖參考下面內容
參考:https://blog.csdn.net/JHON07/article/details/82726333??
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的静态变量加载时间,静态代码块加载时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: face alignment by 30
- 下一篇: 2020年跨境电商好用的20个ERP系统