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 GCFull GC;

 

Scavenge GC:

当对象生成,并且在Eden区中申请空间失败,就会出发,对eden区进行清理非存活对象,并且将存活对象放在survivor区中。

Full GC

年老代被写满;

持久代被写满;

System.gc()被显示调用;

上一次GC之后Head的各域分配策略动态变化。

03.选择合适的垃圾回收算法

串行收集器:使用小型应用;

并行收集器:后台处理,科学计算;

并发收集器:Web服务器/应用服务器、电信交换、集成开发环境。

 

-五、常见配置汇总

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享




本文出自 “qb的博客” 博客,谢绝转载!

以上是关于JVM调优的主要内容,如果未能解决你的问题,请参考以下文章

JVM调优经验分享

JVM性能调优1:JVM性能调优理论及实践(收集整理)

JVM性能调优

JVM性能调优

jvm性能调优都做了啥

JVM参数调优详解