1、方法区、堆——>线程共享;虚拟机栈、本地方法栈、程序计数器->线程隔离;
2、栈中的异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError;
3、会抛出OOM:
如果虚拟机栈可以动态扩展,但是扩展时无法申请到足够的内存,会抛出OOM;
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,会抛出OOM;
当方法区无法满足内存分配需求时,会抛出OOM;
当常量池无法在申请到内存时,会抛出OOM;
当各个内存区域大于物理内存限制时,从而导致动态扩展时,抛出OOM;
4、对象在内存中可分为三个区域:对象头、实例数据、对齐填充
对象头包括:hashcode(25bit)、GC分代年龄(4bit)、锁状态标识(2bit)、线程持有的锁、偏向锁线程ID、偏向时间戳等
另外一部分是类型指针、即对象指向他的类元数据的指针;
5、方法区是如何判断“无用的类”:
该类所有的实例都已经被回收;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有在任何地方被应用
6、新生代GC(Minor GC):发生在新生代的垃圾收集做法,非常频繁,因为大多数java对象都是朝生熄灭,速度较快;
老年代GC(Major GC/Full GC):发生在老年的GC。Major GC速度比Minor GC慢10倍以上。老年代的连续空间小于新生代对象总大小会发生Full GC;
7、类加载的时机:
加载——验证——准备——解析——初始化——使用——卸载