共计 2738 个字符,预计需要花费 7 分钟才能阅读完成。
本文丸趣 TV 小编为大家详细介绍“Tomcat 内存配置的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Tomcat 内存配置的方法是什么”文章能帮助大家解决疑惑,下面跟着丸趣 TV 小编的思路慢慢深入,一起来学习新知识吧。
1. 背景
本文特别备注只介绍基于 HotSpot VM 虚拟机, 并且基于 JDK1.7 的内存分配情况, 有关 GC 的说法也是基于 CMS 的 concurrent collection(而非 G1), 防止大牛拍砖.
目前主流的 JVM 就是 HotSpot VM(其次还有 J9 VM,Zing VM), 目前各类博客文章也大多基于 JDK1.7 以前的版本进行阐述的.
(注: 因为不同的虚拟机实现, 不同的 JDK, 内存的分布都不一样, 也就是说下面文章中提到的内存结构都只是逻辑结构, 并不是内存的物理结构)
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), 如下图
年轻代:(针对年轻代的垃圾回收我们简称 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 中,*** 代被彻底移除,取而代之的是另一块与堆不相连的本地内存 mdash; mdash; 元空间)
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 的内存以供项目使用,依据上图我们给出如下配置。
运行模式:
-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 修改就可以了. 如下图
3. 如果是使用 myeclipse 开发中, 启动 tomcat, 上述的修改就不起作用了, 可进行如下设置:
Myeclipse- preferences- myeclipse- servers- tomcat- tomcat times;. times;- JDK 面板中的 Optional Java VM arguments 中添加如下内容:
-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m
读到这里,这篇“Tomcat 内存配置的方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注丸趣 TV 行业资讯频道。