值得阅读的内存泄露分析总结和Tomcat调优
直接内存区并不是 JVM 打点的内存地区的一部门,而是其之外的。该地区也会在 Java 开拓中行使到,而且存在导致内存溢出的隐患。假如你对 NIO 有所相识,也许会知道 NIO 是可以行使 Native Methods 来行使直接内存区的。 Part2.Heap(堆)和CMS垃圾接纳算法 下面我们要具体说明一下Heap,Heap(堆)又可以细分成三部门,Old Gen(晚年堆),Eden Space(年青堆也叫伊甸园),Survivor Space(S0+S1)。我们可以通过设置参数节制Heap的巨细,详细配置在后头调优会讲。当措施运行时,大大都环境new的一些工具,最开始城市存放Par Eden Space,然后多次接纳(Young GC)之后如故存活的工具就会挪到CMS Old Gen(晚年堆)。必要留意的是除此之外,大的数组工具且工具中无外部引用的工具,和通过启动参数配置的-XX:PretenureSizeThreshold=1024(字节),高出这个巨细的工具城市直接分派到CMS Old Gen(晚年堆)。下面我们要讲的垃圾接纳算法就是产生在这个处所。在我们应用情形中,因为我们设置了CMS GC(并发GC)的接纳要领,以是对Eden Space行使的GC算法默认就是ParNew(并行GC)。这里供Par Eden Space和Old Gen选择的GC算法有许多种,可以按照本身的情形选择,一样平常多核CPU城市选择CMS(并发GC),这样更高效。 CMS执行进程可以分成:初始标志,并发标志,并发预处理赏罚,重标志,并发整理,重置六个阶段,这里必要留意的是初始标志和重标志两个阶段是必要Stop-the-world,其他阶段都是和措施其他历程并发执行的,System.gc()挪用的Full GC的整个进程都是Stop-the-world,这也是为什么说CMS是对体系影响最小的垃圾接纳要领。 初始标志:该阶段举办可达性说明,标志GC ROOT可以直接关联的工具。留意这里是直接关联,间接关联的将在第二阶段举办标志。那么什么可以作为GC ROOT呢,一样平常是:①假造机栈中的引用工具。②要领区中类静态属性引用的工具③要领区中常量引用工具④当处所法栈中JNI引用工具。 并发标志阶段:该阶段举办GC ROOT Tracing(各人可以把这个想象成由一个Root组成的树,树上除了Root节点,存在引用相关的其他节点到Root都有可达路径。),在第一阶段被停息的线程所有规复执行,然后从上一阶段mark的工具出发,对全部可达的工具举办标志。 并发预处理赏罚:这一步就是CMS算法的精华地址,由于CMS是以获取最短的停即刻间为目标的GC算法。在mark和remark两个阶段都必要Stop-the-world,以是并发预处理赏罚的目标就是提前做一些remark做的工作,减短remark阶段的耗时。这一阶段,将标志从Eden Space提拔的工具、从Eden Space分派到Old Gen的工具,以及在并发标志阶段被修改的工具。怎么确定一个工具是否存活,即通过追踪GC ROOT Tracing有可达路径的工具就是在世的。举个例子吧,就好比说一个在Old Gen中存在工具B,在并发标志阶段没被标志成alive,眼看就要小命不保了,就在这个时辰措施历程又New了一个工具A,此时A工具又引用了Old Gen中的B工具(由于并发标志阶段并不是Stop-the-world,以是措施历程和标志历程是并发执行的)。那么这个工具B就不该该被接纳掉,由于被A捞了一把,手牵手进入了GC ROOT Trace。这个B在并发预处理赏罚阶段就会被标志成alive。 重标志:这个阶段也是要Stop-the-world的,从头扫描堆中的工具,再次举办可达性说明,标志alive的工具。 并发整理:从头激活用户线程,然后整理哪些dead Objects(不存在引用的工具)。 重置:CMS清晰内部状态,筹备下一次接纳。 为了更好地声名CMS接纳的进程,这里贴一段现实场景中的GC日记:
关于CMS算法的优弱点,尚有详细实现的的一些细节,这里就不做过多论述了,有乐趣的可以自行查阅资料。 Part3.MAT说明器材和Jprofile说明器材 一顿操纵猛如虎,根基相识了JVM的内存的构成和垃圾接纳相干的基本信息。然后就要来说明一下WEB应用到底题目出在哪了。工欲善其事,必先利其器,然后我就下载了MAT和Jprofile。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |