JVM
JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。
JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。
堆
堆分年轻代和年老代、持久代,1.7之前有持久代,1.8取消了持久代,被元空间取代,元空间不在JVM,占用的本地内存,元空间可以防止OOM,内存溢出,存的new对象;年轻代和年老代比例1:2。
年轻代:分Eden区8M,From区1M,To区1M。
年轻代10M,年老代20M,new一个8M对象会放到Eden区,在new一个8M对象,Eden区如果放了一个8M对象,然而FROM和TO只能放1M,那么就会放到年老代,通过N次GC就可以放到年老代。GC判断内存超过98%(一般90%),就会GC。新生代存的是从GC中存活下来的,from和to只会有一个进行使用。
方法区:可以放在持久代,GC很多操作没有对其进行回收,存储的是类信息,指针,引用,即时编译代码等。
虚拟机栈
虚拟机栈用来存储别人方法,本地方法栈存储自己的,虚拟机栈存储的是当前线程需要使用的方法。一个方法一个栈帧。
例如一个线程:
局部变量表:定义变量,常量。
通过操作数栈进行操作、进行参数传递或者算数运算,算好之后在传回去。
动态链接:把链接这个过程推迟到了运行时再进行。
返回地址:正常返回给调用方;异常返回错误信息,无论正常异常根据返回地址返回给调用方,异常处理器通知返回到哪里,异常返回恢复局部变量表,操作数栈。
程序计数器
保证程序能够按照顺序执行。
JVM内存回收
JVM内存回收总是在指堆内存回收,所以以上对象的年轻代和年老代都是指的JVM的Heap空间,而持久代则是之前提到的MethodArea,不属于Heap堆内存。
GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。
四种引用:强软弱虚。
(1)强引用:默认对象采用的都是强引用,在这个对象实例没有其他对象引用时,GC才会被回收;
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用,在内存不够用时才会被GC回收;
(3)弱引用:在GC时一定会被GC回收;
(4)虚引用:用来判断对象是否被GC回收。