java对象生命周期分析
说明:本文是我对自己之前学到知识的总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习。
- 通过字节码分析程序中对象是怎样加载运行的
- 1.代码
public class People{
public int age = 18;
public People(){
this.age = 20;
}
public static void main(String[] args){
People p = new People();
System.out.println(p.age);
}
}
输出结果为:20
- 2.对象在类加载器中执行
- 3.对象在JVM中运行过程
People.class通过类加载器完成加载后,类的所有信息就保存在了方法区中,JVM通过这些信息找到Main方法,开始执行Main方法,当遇到new关键字时,创建对象,将对象压入栈中执行。
,实例数据(属性值等信息),对齐填充(JVM要求java的对象占的内存大小应该是8bit的倍数)组成。
总结:程序运行在自己的线程栈中,私有空间,线程安全。在程序加载到JVM中,遇到new创建对象时,会在堆内存中开辟一块空间存放对象信息,堆内存空间被所有程序共享,所以存在线程安全问题。为了使线程安全,我们一般可以通过给临界区资源加锁的方式解决线程安全问题。还可以通过ThreadLocal的方式保证线程安全,ThreadLocal可以看作是每个线程栈中开辟存储临界资源的一种方式,线程栈是线程私有的,所以也能保证线程安全。