JAVA创建类时的内存变化

Java内存分五个区域,其中两个区域是线程公有的,分别是堆区和方法区(常量池在方法区,jdk1.7之后独立出来),剩下三个区域是每个进程都有的:程序计数器,虚拟机栈(线程栈),本地方法栈。(很多虚拟机会将虚拟机栈和本地方法栈合并为一个,本地方法栈是java用来调用非java所写的程序用的)。


一个java程序执行时,首先JVM进程(包含类加载器class loader和执行引擎)被创建,主线程执行static main,创建栈帧并压入虚拟机栈(虚拟机栈一个线程一个栈),执行到new object时,class loader将用到的类文件(class file)加载到方法区,在堆区创建一个对象,并将对象的引用赋给变量。


ps:

  1. 静态变量和静态代码块放在方法区内.

  2. 静态代码块执行是在类加载时,先于构造函数,但不一定是在程序最开始时加载,一般在第一次调用时且执行一次(第一次调用时才会加载该类,如果该类包含main方法,会在程序开始时直接加载,java是动态加载),所以如A a;这样的语句并不会执行静态代码,代码执行顺序:父类静态-子类静态-父类非静态-子类非静态。

  3. JAVA创建类时的内存变化_第1张图片
    Paste_Image.png

    虚拟机对栈帧会优化,有一部分数据是重叠的。

  4. 这图很清楚
    JAVA创建类时的内存变化_第2张图片
    Paste_Image.png

你可能感兴趣的:(JAVA创建类时的内存变化)