JVM调优
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优相关的知识,希望对你有一定的参考价值。
-一、基础概念
01.数据类型
① 基本数据类型:byte,short,int,long,char,float,double,Boolean
② 引用数据类型:类类型,接口类型和数组
02.堆与栈
① 栈是运行时单位,而堆是存储的单位。
② 堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用。
③ 由于程序运行在栈中进行,所以传递参数的时候,只存在传递基本数据类型和对象引用的问题,所以它都是进行传值调用。
④ Java中栈的大小通过-Xss来设置。
03.引用类型
① 强引用:声明对象时虚拟机生成的引用,如果被强引用,则不会被垃圾回收。
② 软引用:一般被作为缓存来使用,当内存紧张的时候,这种类型引用的空间会被回收;
③ 弱引用:与软引用差不多,也是作为缓存使用,但是每次垃圾回收肯定会被回收;
-二、基本垃圾回收算法
01.按照基本回收策略分
1) 引用计数法:
2) 复制:
3) 标记整理:
02.按系统线程分
① 串行收集:使用单线程处理所有垃圾回收工作;
② 并行收集:使用多线程处理所有垃圾回收工作;
③ 并发收集:前面 两个在进行垃圾会收的时候需要暂停整个运行环境,而只有垃圾回收线程在运行,并发收集不需要暂停。
-三、垃圾回收面临的问题
01.如何区分垃圾:
栈是真正进程开始执行的地方,一个栈是与一个进程相对应的,如果有多个线程的话,必须对这些线程对应的栈进行检查。
除了栈外还有系统运行时的寄存器,也是存储程序运行时的数据。
这样以栈和寄存器的引用为起点,我们就可以找到堆中的对象,又从这些对象找到堆中其他对象的引用,这种逐步扩展,最终以null引用或者基本数据类型结束,这样就形成了一颗以Java栈中所对应的对象为根结点的对象树,如果有多个引用就会有多个对象树。在对象树上,都是当前所需要的对象,不能被垃圾回收。而其他剩余对象,则被视为无法被引用的对象,可以被当做垃圾回收。
02.如何处理碎片
“复制方法”和“标记-整理”都可以。
03.如何解决同时存在的对象创建和对象回收问题
垃圾回收线程是回收内存的,而程序运行线程则是消耗内存的,存在矛盾。如果采用先暂停,进行垃圾回收,然后开启,这样的问题是:当堆空间持续增大,垃圾回收时间也会增大,对应暂停时间也会增大。可以采用并发垃圾回收。
-四、分代垃圾回收
01.分代垃圾回收
虚拟机中共划分为三个代:年轻代,年老代,持久代(存放Java类的类信息)
过程:
新生代分为三个区:Eden区,两个Survivor区;
刚产生的对象在eden区,这个区满了以后,还存活的对象将被复制到survivor区(两个中的一个),当这个survivor区也满了以后,此区的存活对象被复制到另外一个survivor区,当第二个survivor区对象也满了以后,将存活的对象复制到年老区。需要注意,两个survivor区是对称的,没有先后关系。
02.触发垃圾回收的条件
GC的两种类型:Scavenge GC和Full GC;
Scavenge GC:
当对象生成,并且在Eden区中申请空间失败,就会出发,对eden区进行清理非存活对象,并且将存活对象放在survivor区中。
Full GC:
年老代被写满;
持久代被写满;
System.gc()被显示调用;
上一次GC之后Head的各域分配策略动态变化。
03.选择合适的垃圾回收算法
串行收集器:使用小型应用;
并行收集器:后台处理,科学计算;
并发收集器:Web服务器/应用服务器、电信交换、集成开发环境。
-五、常见配置汇总
本文出自 “qb的博客” 博客,谢绝转载!
以上是关于JVM调优的主要内容,如果未能解决你的问题,请参考以下文章