Java JVM and GC

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 空闲区间

把存活对应复制到空间区间中。一次性回收所有的活动区间中的内容。

标记-整理算法

类似于标记-清除,只是在清除不存活的对象以后,把存活对象进行移动,从而使得内存碎片化降低。

算法的使用

一般新生带使用 复制算法,老生带一般使用 标记-整理算法。

你可能感兴趣的:(Java JVM and GC)