JAVA基础笔记(十七)JVM

来源:互联网 发布:复杂网络 计算机 编辑:程序博客网 时间:2024/06/05 00:46

JAVA内存模型:
当jvm将所需要的*.class文件加载到JVM进程之中,那么这个过程就需要一个类加载器,好处在于:可以跟随已制定程序.class文件的所在路径;

在运行时数据区之中,分为如下几块内存空间:
·堆内存:保存所有的引用数据类型的真实信息;
·栈内存:基本类型、运算、只想堆内存的指针;
·方法区:所有定义的方法的信息都保存在方法区之中,此区属于共享区;
·程序计数器:是一个非常小的内存空间,小的可以忽略;
·本地方法栈:每一次执行递归的方法处理的时候实际上都会将上一个方法入栈;

StackOverflowError异常与OutOfMemoryError异常
栈内存是线程私有的,其生命周期与线程现同;
虚拟机栈描述的是Java方法执行的内存模型;执行一个方法时会产生一个栈帧,随后将其保存到栈顶,顶部的栈帧就表示当前方法;
如果请求的栈的深度过大,就会抛出stackOverflowException;
如果虚拟机的实现中允许,虚拟机栈动态扩展,但内存不足以扩展栈的时候会抛出OutMemoryException异常;

栈是运行时的单位,里面存储的都是与当前线程有关的信息,局部变量,程序运行状态,方法返回值信息等;
堆只是保存对象信息;

三种JVM
·sun最早改良的HotSpot
·BEA公司的JRockit
·IDM JVM’S

GC垃圾回收:
伊甸园:
新生代:存活区:servivor与spaces大小相等 年轻代中使用Minor GC进行回收(复制算法)

堆内存:老年代:旧生带: 保存空间较大 老年代使用Full GC进行回收(整理-压缩)
存活区:
元空间:元空间:使用的是物理内存

Java1.8之后永久带内存被取消了;目的是为了将HotSpot与JRockit两个虚拟机标准联合在一起;

GC处理流程
1,如果Eden区空间充足,直接创建,如果不充足,GC通过Minor GC回收不活跃对象,回收之后如果Eden区充足,创建,否则查看servivor(新生代存活区)是否充足,充足,将Eden区对象保存在servivor区,创建对象,否则查看Tenured(老年代旧生代)空间是否充足,充足,将servivor中的对象保存在Tenured区之中,Eden中的对象保存在servivor中,创建对象,否则,利用Full GC进行垃圾回收,查看Tenured空间是否充足,充足,将Service中的对象保存在Tenured中,将Eden中的对象保存在Service中,创建新对象,否则,抛出OutOfMemoryError;

堆内存参数调整(调优关键):
对伸缩区进行调整:
java -Xmx16G -Xms16G TestDemo

什么时候会出现GC,如何处理
1, java中有两种GC回收方法,年轻代中的Minor GC,老年代中的Full GC
2, 新对象创建时如果伊甸园区空间不足会触发Minor GC,如果此时老年代内存空间不足会触发Full GC,如果空间都不足抛出OutOfMemoryError。

如果整个java项目运行缓慢,应该怎么解决
避免堆内存空间的伸缩空间进行操作,将初始化内存空间与整体堆内存空间大小设置为一样,使用Xms,Xmx;

当GC方法执行时会产生何种GC
一定会产生Full GC

当一个对象非常大的时候,是如何保存的
该对象将直接保存在老年代;

常用GC策略:
单机程序:年轻代串行GC、老年代:串行GC(MSG);
服务器程序:并行回收GC、老年代、并行GC;

G1收集器:
主要应用在大cup或目的掉CMS收集器;

java中的引用:
强引用
软引用 :不足时回收,充足时不回收,要通过SoftReference来实现软引用
弱引用 :只要GC处理,就被回收, 通过WeakHashMap实现弱引用;
幽灵引用;永远取得不了的数据就要幽灵引用

0 0