方法区域(Method Area)

在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。

方法区域存放所加载类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName,isInstance等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,就会抛出OutOfMemory的错误信息。

运行时常量池(Runtime Constant Pool)

存放的为类中的固定常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

本地方法堆栈(Native Method Stacks)

JVM采用本地方法堆来支持native方法的执行,此区域用于存储每个native方法调用的状态。

JVM垃圾回收

GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。

对新生代的对象收集称为minor GC

对旧生代的对象收集称为Full GC

程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型,GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用时, GC时才会被回收)

软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有内存不够的情况下才会被GC)

弱引用:在GC时一定会被GC回收。

虚引用:虚引用只是用来得知对象是否被GC。