研究內(nèi)存的初始化時(shí)機(jī),有助于設(shè)計(jì)“降低應(yīng)用內(nèi)存消耗”方案!  public class A {  private Object mObject = new Object();// or static  private st..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java高級之內(nèi)存初始化時(shí)機(jī)

發(fā)布時(shí)間:2020-07-13 00:17:40 來源:網(wǎng)絡(luò) 閱讀:264 作者:nineteens 欄目:編程語言

  >研究內(nèi)存的初始化時(shí)機(jī),有助于設(shè)計(jì)“降低應(yīng)用內(nèi)存消耗”方案!

  public class A {

  private Object mObject = new Object();// or static

  private static long sStartInitlizeTime;

  private static String mClzName;

  private static final long sDelayTime = 2000;

  static {

  sStartInitlizeTime = System.currentTimeMillis();

  while (System.currentTimeMillis() - sStartInitlizeTime > sDelayTime) {

  break;

  }

  System.out.println(mClzName + " static塊 " + sDelayTime + "秒延時(shí)結(jié)束");

  }

  public A(String clzName) {

  // TODO Auto-generated constructor stub

  mClzName = clzName;

  }

  public void print() {

  System.out.println(mClzName + "\t" + mObject.toString());

  }

  }

  先看定義的實(shí)例類A,使用“靜態(tài)塊”、“構(gòu)造器”、“print方法”來監(jiān)控“類何時(shí)初始化”!

  public class TestAInitialize {

  public static void main(String[] args) {

  for (int i = 0; i < 5; i++) {

  String name = "A" + i;

  new Thread(new Runnable() {

  @Override

  public void run() {

  // TODO Auto-generated method stub

  new A(name).print();

  }

  }).start();

  }

  }

  }

  用這個(gè)類,來驗(yàn)證類A的初始化內(nèi)容

  結(jié)果1:

  null static塊 2000秒延時(shí)結(jié)束

  A3 java.lang.Object@6b19c877

  A1 java.lang.Object@6695b54d

  A4 java.lang.Object@1e6fa5a2

  A2 java.lang.Object@8730a97

  A0 java.lang.Object@44029c5d

  說明兩個(gè)問題

  第一、“static塊”先于“構(gòu)造器”執(zhí)行(延時(shí)任務(wù)就是用來驗(yàn)證這個(gè)結(jié)論的);

  第二、非靜態(tài)的Object,每次都被new了一個(gè)。

  把Ojbect改成static的

  結(jié)果2:

  null static塊 2000秒延時(shí)結(jié)束

  A2 java.lang.Object@6695b54d

  A0 java.lang.Object@6695b54d

  A3 java.lang.Object@6695b54d

  A4 java.lang.Object@6695b54d

  A1 java.lang.Object@6695b54d

  結(jié)果1與結(jié)果2,對比說明:靜態(tài)變量只會被初始化一次。

  ------------------------------------------------------------------------------------------------------------------------

  類何時(shí)初始化呢?

  public class TestInitialize {

  /**

  * 類加載

  */

  private static void testClassLoad() {

  System.out.println("---------testClassLoad--------------");

  try {

  Class.forName("A", false, TestInitialize.class.getClassLoader());

  } catch (ClassNotFoundException e) {

  System.out.println("Initalize A is false " + e.getMessage());

  }

  try {

  Class.forName("A", true, TestInitialize.class.getClassLoader());

  } catch (ClassNotFoundException e) {

  System.out.println("Initalize A is true " + e.getMessage());

  }

  Class clzA = StaticA.class;

  System.out.println(clzA.getName());

  }

  /**

  * 類初始化

  */

  private static void testClassInitialize() {

  System.out.println("------------testClassInitialize----------");

  StaticA.print();

  }無錫×××醫(yī)院 https://yyk.familydoctor.com.cn/20612/

  public static void main(String[] args) {

  testClassLoad();

  testClassInitialize();

  }

  }

  只執(zhí)行testClassLoad方法,

  結(jié)果1:

  ---------testClassLoad--------------

  Initalize A is false A

  Initalize A is true A

  com.java.thinking.dalvik.StaticA

  說明:不論加載類A,還是調(diào)用A的類方法,都不會執(zhí)行初始化操作。

  只執(zhí)行testClassInitliaze方法,

  結(jié)果2:

  ------------testClassInitialize----------

  null static塊 2000毫秒延時(shí)結(jié)束

  null java.lang.Object@7852e922

  說明:類的“方法”被調(diào)用時(shí),類才真正初始化。同理可證,類的“變量”被調(diào)用時(shí),類才真正初始化。

  PS:被調(diào)用,無論是直接new對象、定義靜態(tài)方法/變量,還是通過反射等操作,都可以。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI