首先我们写一个java程序,运行前必须要进行compile也就是编译,把.java程序编译成class文件,然后才能开始运行,当我们一点一个程序运行的时候,会从程序入口开始,java一般就是从main函数开始执行,并不是程序一开始运行就会先把我们所有写好的类全部都加载进内存中,他是根据程序流程来按需加载的,有可能我们写的某些类从头都没被用过,他就不会被虚拟机进行加载。
当我们去根据一个类去new对象的时候首先会查找这个类的.class文件是否存在于内存中,没有,则进行类加载,首先根据包名去以二进制流的形式加载到内存中,这其中步骤还是比较多的,会有一些验证等工作,最后还会初始化这个类,主要就是看看有没有静态变量和静态代码块,做好初始化工作,
这个类对象是存储在方法区的,而方法区又是在堆内存中的,这块对内存不同于普通的堆内存,他不会被垃圾回收器正常回收,一般不会去回收,但是在安卓中经常出现由静态变量导致的crash,当内存相当不足的时候这些静态变量也是会被回收的,所以在安卓中使用静态变量最好在本地中序列化一份,其实就相当于sharedpreference.的功能,本地和内存中都有一份数据。