Java内存区域与内存溢出
- 数据区域:方法区,虚拟机栈,本地方法栈,堆,程序计数器
- 为了线程切换后能回复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,称为线程私有内存。
Java内存区域
在 Java 中内存被分为三个区域:Young Generation(年轻代)、Old Generation(年老代)、Permanent Generation(持久代)。最近分配的对象会存放在 Young Generation 区域。对象在某个时机触发 GC 回收垃圾,而没有回收的就根据不同规则,有可能被移动到 Old Generation,最后累积一定时间在移动到 Permanent Generation 区域。系统会根据内存中不同的内存数据类型分别执行不同的 GC 操作。
双亲委派机制
- 比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个class文件(.class)被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。
- 双亲委派模型:除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,父子关系不是继承而是组合。
- 启动类加载器——扩展类加载器——应用程序类加载器——自定义类加载器
- 双亲委派工作过程:如果一个类加载器收到了类加载请求,首先把这个请求委派给父类加载器去完成,只有当父加载器无法完成这个加载请求(没有找到所需的类)子加载器才会尝试自己加载。
- 好处:无论哪个类加载器要加载这个类,都要委派给处于顶端的启动类加载器,因此Object类在程序的各类加载器环境中都是同一个类。自行加载的话,每个自定义加载器都加载一个Object。双亲委派机制很好的解决了各个类加载器的基础类的统一问题(越基础的类由越上层的加载器进行加载)