加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

这才是Tomcat内存配置的正确姿势

发布时间:2019-01-29 22:09:58 所属栏目:业界 来源:小白的梦
导读:1.配景 固然阅读了各大牛的博客或文章,但并没有找到出格全面的关于JVM内存分派要领的文章,许多都是复制黏贴 为了严谨,本文出格备注只先容基于HotSpot VM假造机,而且基于JDK1.7的内存分派环境,有关GC的说法也是基于CMS的concurrent collection(而非G1),防备
副问题[/!--empirenews.page--]

 1.配景

固然阅读了各大牛的博客或文章,但并没有找到出格全面的关于JVM内存分派要领的文章,许多都是复制黏贴

为了严谨,本文出格备注只先容基于HotSpot VM假造机,而且基于JDK1.7的内存分派环境,有关GC的说法也是基于CMS的concurrent collection(而非G1),防备大牛拍砖.

今朝主流的JVM就是HotSpot VM(其次尚有J9 VM,Zing VM),今朝衷耘喋客文章也大多基于JDK1.7早年的版本举办叙述的.

(注:由于差异的假造机实现,差异的JDK,内存的漫衍都纷歧样,也就是说下面文章中提到的内存布局都只是逻辑布局,并不是内存的物理布局)

本文只先容内存分派的要领,有关于详细的垃圾接纳机制,内存布局的道理不作为本文重点,也但愿通过本文让各人对JVM有一点点的认知,小编对JVM领略并不透彻,不想误人后辈。

2.内存总体布局

假如只是为了办理题目,不想相识个中缘由的请跳过本章节

本文先容的是垃圾接纳的内存地区的布局(简称GC堆,不包罗措施计数器,栈,当处所法栈),引用一个大牛的说法《一个java工具的这一辈子》

我是一个平凡的Java工具,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟(其他java工具),我们在Eden区中玩了挺长时刻。有一天Eden区中的人其实是太多了(会触发Young GC,每次GC加一岁)),我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,偶然辰在Survivor的“From”区,偶然辰在Survivor的“To”区,居无定所(每次Young GC都必要Survivor区中的from区和to区"对换")。直到我18岁的时辰(举办了18次Young GC),爸爸说我成人了,该去社会上闯闯了。于是我就去了大哥代何处,大哥代里,人许多,而且年数都挺大的,我在这里也熟悉了许多人。在大哥代里,我糊口了20年,然后被接纳(Old GC)。

表明一下,起首内存总体分为年青代(young),晚年月(old),永世代(permanent),如下图

这才是Tomcat内存设置的正确姿势

年青代:(针对年青代的垃圾接纳我们简称Young GC)

年青代分为eden区,survivor区

1.eden区,是new Object(),工具降生的处所

2.survivor区是颠末垃圾接纳后的仍存活的工具存储地区,survivor区中又分为from区和to区

2.1.from区: 颠末GC接纳,eden区和to区仍存活的工具会存放在from区

2.2.to区: 颠末GC接纳,eden区和from区仍存活的工具会转移到to区

2.3.正由于2.1和2.2的操纵,以是from区和to区中的存活工具往返转移,而且始终有一个区是空的

晚年月:(针对晚年月的垃圾接纳简称Old GC)

颠末18次Young GC后年青代中仍存活的工具,会从年青代中转移到晚年月

晚年月满了之后,会触发Old GC,仍存活的工具继承保存在晚年月中,直到颠末20次Old GC举办接纳

永世代:(针对年青代+晚年月+永世代的接纳简称Full GC)

是HotSpot VM针对Java要领区的一个实现,凡是存储类信息、常量池、静态变量、JIT编译后的代码等数据(简朴领略成编译代码的存储地区,即可以领略成:我们的java项目运行时,加载的类文件越多,则必要的永世代内存空间越大)

(注:听说永世代是Hotspot假造机特有的观念,此外JVM都没有这个对象,在Java 8中,永世代被彻底移除,取而代之的是另一块与堆不相连的当地内存——元空间)

3.凡是内存题目表明

常见题目一 java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出

缘故起因:项目运行阶段,new的工具过多,撑满了设置的最大内存,会呈现该错误

办理要领:手动配置Xms ,Xmx 的巨细.

常见题目二 java.lang.OutOfMemoryError: PermGen space ----PermGen space (永世代) 溢出

缘故起因:开拓的项目Java文件较量多的时辰,会呈现该错误(即项目很大,被JVM加载的文件许多)

办理要领:手动配置MaxPermSize巨细.

常见题目三 java.lang.StackOverflowError ---- 栈溢出

缘故起因:凡是都是某个代码逻辑递归条理太多导致的,

办理要领:修改递归代码,节制递归层数

4.内存分派要领(提议,非华陀再世)

本文只先容常用的一些设置参数,凡是环境下永世代不算堆内存(单独有效另一块内存),新生代占大哥代的1/2,即占整个堆内存的1/3,凭证这个原则我们给出一个设置例子。

好比处事器可以提供1G的内存以供项目行使,依据上图我们给出如下设置。

这才是Tomcat内存设置的正确姿势

运行模式:

-server 处事器模式,多CPU时,机能更佳

新生代与晚年月:(凡是不光独设置新生代与晚年月,以是直接设置整个内存堆巨细即可)

-Xms384m 内存堆初始的内存空间

-Xmx768m 内存堆最大内存空间

永世代:(新生代,晚年月设置剩余的内存留给永世代)---留意jdk1.8已移除

-XX:PermSize=128m 永世代初始化巨细

-XX:MaxPermSize=256m 永世代最大的内存空间(默以为64m)

4.差异情形下的Tomcat内存设置要领

前面已经举办种种内存题目的详解以及设置参数的扼要先容,下面我们先容一下各类情形下的详细设置要领.

1. 行使呼吁行启动的tomcat:

修改TOMCAT_HOME/bin/catalina.sh(windows中是catalina.bat), 在文件上方添加如下语句

JAVA_OPTS="-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m"

2.假如tomcat注册成了windows处事,行使tomcat目次中的/bin/tomcat8w.exe修改就可以了.如下图

这才是Tomcat内存设置的正确姿势

3.假如是行使myeclipse开拓中,启动tomcat,上述的修改就不起浸染了,可举办如下配置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的Optional Java VM arguments中添加如下内容:

-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m

最后说两句:

不管设置什么,以及设置的参数值是几多,都必要按照现实项目不绝的调试,不要等闲放弃.

好比tomcat的内存设置,也不是越大越好,得当项目/得当处事器设置步崆最好的

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读