Java JVM and GC
类加载
方法区
内容:类信息和类静态变量,常量池
类信息:非常多
主要使用的类信息:1. 类型的字段信息 2. 类型的方法信息
Heap
Java的对象和数组申请的空间都是从Heap中分配的。(引用是在栈中)
所有的线程都是共享一个Heap的。
Stack
保存基本数据类型和自定义类型的引用。但是对于包装类型:Boolean,Long等存放于Heap中。
每一个线程都有自己的stack。
本地方法Stack
用于存储本地方法的局部变量表,和JVM stack功能类似
程序计数器
每一个线程都有独立的程序计数器
JVM 常量池
存在在方法区中,存储的是常量的引用
GC 内容
Young generation
新生代空间较小,被分为3个区域:Eden,From,To三个区域。
创建的对象在Eden区,Eden区域GC后存活对象存放在幸存者空间(存放在同一个幸存者区间);当一个幸存者空间饱和,还存活的幸存者会被移动到另一个幸存者空间,然后清零另一个幸存者空间。如果被一定多次的对象,就会被移动到老年代。
这里发生的GC 为Minor GC。
Old generation
大部分内容都是由于新生代移动过来的。
这里发生的GC为Major GC或者Full GC。
Permanent generation
方法区,保存常量和字符串常量。
GC 算法
根搜索算法:
类似一个图遍历,能够从root遍历到的节点就是不会被GC。
标记清除算法:
扫描,存活对象进行标记,不存活对象进行清理。
会造成内存的碎片化。
复制算法
两个空间:活动区间 or 空闲区间
把存活对应复制到空间区间中。一次性回收所有的活动区间中的内容。
标记-整理算法
类似于标记-清除,只是在清除不存活的对象以后,把存活对象进行移动,从而使得内存碎片化降低。
算法的使用
一般新生带使用 复制算法,老生带一般使用 标记-整理算法。