java的jvm内存结构主要分为三大块: 堆内存, 占内存, 方法区.
堆内存: 是JVM中最大的一块内存地址, 他主要是由年轻代,年老代,持久代组成, 所有new出来的对象都放在该内存里.
栈内存: 暂存数据的地方, 每个线程都包含一个栈区, 栈存放在一级缓存中, 存取速度快, 栈中只保存基础的数据类型和自定义对象的引用,每个栈中的数据都是私有的, 其他栈不能访问,
方法区: 存放要加载类的信息(如类名,修饰符等), 静态变量, 构造函数, final定义的常量, 类中的字段和方法等信息.
垃圾回收机制:
Gcroot:被GCroot引用的对象才可以存活
1). 虚拟机栈中引用的对象
` 2). 方法区中的类静态属性引用的对象
3). 方法区中的常量引用的对象
4). 本地方法栈中JNI(Native方法) 引用的对象
垃圾回收算法:
Marking-Sweep(标记-清除法) 没有被引用的直接标记,然后把标记的删除.(会有空间的浪费)
Marking-Compat(标记-整理法) 先整理不删除,将引用的和空闲的分开,统一删除(没有空间浪费) 复制算法: 将内存划分为大小相等的两块, 当一块的内存用完了, 就把还存活的对象复制到另一块,然后将之前的那一块清理掉. (浪费内存太多, 对年老代的使用,效率低) 分代收集算法: (当前商业虚拟机都采用这个) 根据对象存活中中的不同,将内存分为几块: 一般为新生代,年老代, (新生代用复制算法, 年老代用的是整理算法进行回收)
分代:
对象的生命周期不同所以会分代:
新生代(Minor GC):1-8 (s0-s1反复) 频率高
老年代(Major GC):9 频率低
常见的回收器:
Serial Garbage Collector: 单线程GC;
Parallel Garbage Collector: 多线程GC
CMS Garbage Collector: 多线程GC;
G1 Garbage Collector: jdk7引进GC.多线程,高并发.低暂停,逐步取代CMS GC;