Java高级之内存初始化时机

>研究内存的初始化时机,有助于设计“降低应用内存消耗”方案!

成都创新互联公司是专业的堆龙德庆网站建设公司,堆龙德庆接单;提供成都网站建设、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行堆龙德庆网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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 + "秒延时结束");

}

public A(String clzName) {

// TODO Auto-generated constructor stub

mClzName = clzName;

}

public void print() {

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

}

}

先看定义的实例类A,使用“静态块”、“构造器”、“print方法”来监控“类何时初始化”!

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();

}

}

}

用这个类,来验证类A的初始化内容

结果1:

null static块 2000秒延时结束

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

说明两个问题

第一、“static块”先于“构造器”执行(延时任务就是用来验证这个结论的);

第二、非静态的Object,每次都被new了一个。

把Ojbect改成static的

结果2:

null static块 2000秒延时结束

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

结果1与结果2,对比说明:静态变量只会被初始化一次。

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

类何时初始化呢?

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();

}无锡×××医院 https://yyk.familydoctor.com.cn/20612/

public static void main(String[] args) {

testClassLoad();

testClassInitialize();

}

}

只执行testClassLoad方法,

结果1:

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

Initalize A is false A

Initalize A is true A

com.java.thinking.dalvik.StaticA

说明:不论加载类A,还是调用A的类方法,都不会执行初始化操作。

只执行testClassInitliaze方法,

结果2:

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

null static块 2000毫秒延时结束

null java.lang.Object@7852e922

说明:类的“方法”被调用时,类才真正初始化。同理可证,类的“变量”被调用时,类才真正初始化。

PS:被调用,无论是直接new对象、定义静态方法/变量,还是通过反射等操作,都可以。


分享名称:Java高级之内存初始化时机
文章网址:http://hbruida.cn/article/pscess.html