1.面向对象的内存分析
<1.>栈(Stack):系统分配的一个连续的内存空间
方法执行的内存模型,每个方法被调用时都会创建一个栈帧;
JVM为每个线程创建一个栈;
栈属于线程私有,不能够被线程间共享;
存储特性:“先进后出,后进先出”;
<2.>堆(heap):不连续的内存空间
用于存储对象和数组;
JVM只有一个堆,被所有线程共享;
<3.> 方法区(method area)
用于存放程序中永远不变或唯一的内容;
JVM只有一个方法区,被所有线程共享;
2.垃圾回收原理和算法
<1.>内存管理:主要是对堆中的对象管理
分配:new关键字赋值;
释放:对象赋值为null;
<2.>垃圾回收
过程:Ⅰ.发现无用对象;Ⅱ.回收无用对象的内存空间;
算法:Ⅰ.引用计数法(缺点:循环引用的无用的无用对象无法识别)
Ⅱ.应用可达法(程序把所有的引用关系看作一张图,没有被引用的节点即为无用 节点);
<3.>通用的分代垃圾回收机制
栈内存 | Eden区 | Survivor1区 | Survivor2区 | Tenured/old区 |
管理员 | Minor GC | Major GC/Full GC | Full GC |
内存泄露:创建大量无用对象;
静态集合类(HashMap、Vector、List等)的使用(生命周期=应用程序);
各种连接类未关闭(IO、SQL、网络连接等);
释放对象时,没有删除相应的监听器;
3.this和static关键字
<1.>this:创建好的对象的地址,即代表当前对象;
Ⅰ.普通方法:调用该方法的对象;
Ⅱ.构造方法:只想正要初始化的对对象;
Ⅲ.this调用重载的构造方法时,放于第一行;
Ⅳ.不能用于static方法中;
<2.>static:声明静态成员变量;
Ⅰ.被该类所有实例共享,类被载入时被显式初始化;
Ⅱ.static成员变量只有一份,被所有对象共享;
Ⅲ.调用:类名.类属性/方法(不需要实例化);
Ⅳ.static方法中不可直接访问非static的成员;
Ⅴ.静态初始化块:构造器用于对象的初始化;静态初始化块用于类的初始化操作;
4.包机制(package)
<1.>包名:域名倒着写即可,再加上模块名,便于内部管理;
<2.>写项目要加包,不要使用默认包;
<3.>JDK中主要包:java.lang;java.awt;java.net;java.io;java.util;