Tomcat相关 -- 内存设置

java内存溢出详解

一、常见的java内存溢出

1、java.lang.OutOfMemmoryError : Java heap space  -- JVM Heap (jvm 堆溢出)

JVM启动时自动设置JVM Heap的值,其初始空间(即 -Xms)是物理内存的1/64,最大空间(-Xms)不可超过物理内存。

可利用JVM提供的 -Xmn -Xms -Xmx等选项进行设置。

Heap的大小是Young Generation(新生代)和Tenured Generation(老生代)之和。

在JVM中若98%用于GC,那可用的Heap size不足2%时,就会抛出异常。

解决之道:手动设置 JVM Heap的大小。

2、java.lang.OutOfMemoryError : PermGen space -- PermGen space溢出

Permanent Generation space(永生代):指内存的永久保存区域。

此块内存主要是被JVM存放Class和Meta信息的。Class在被Load时被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的GC不会在主程序运行期对PermGen space进行清理,所以若载入很多的Class,就可能出现PermGen space溢出。

解决之道:手动设置MaxPermSize的大小

3、java.lang.StackOverflowError  -- 栈溢出

JVM依然像C和Pascal一样,采用栈式的虚拟机。函数的调用过程都体现在堆栈和退栈上。调用构造函数的“层”太多,会把栈区溢出的。

一般来说,栈区远远小于堆区,因函数调用过程往往不会多于上千层的,而即便每个函数调用需要1K,那么栈区也不过是需要1MB的空间。

通常栈的大小是1-2MB

解决之道:修改程序。

二、实际环境中的解决方法

在生产环境中tomcat内存设置不好,会出现JVM的内存溢出

1、Linux下的tomcat

修改 TOMCAT_HOME/bin/catalina.sh

位置:cygwin=false前

JAVA_OPTS="-server -Xms256 -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"

2、window下的tomcat

因window下的tomcat启动分为startup.bat启动和注册成了windows服务,以services方式启动。r所以修改方式不同。

1)startup.bat启动

在TOMCAT_HOME/bin下找到catalina.bat,用文本编辑器打开,并加上一行:

set JAVA_OPTS= -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M

说明:加上 -server 是指启动jvm时以服务器方式启动,比客户端启动慢,但性能较好,可以自己选择。

2)windows服务启动

若tomcat是注册成为window服务且是以服务方式启动,那上面方法无效。因此tomcat启动是读取注册表的参数,而不是读取批处理文件参数。此时有两种方法来设置JVM参数。

第一种:tomcat提供了一个设置启动参数的窗体,双击TOMCAT_HOME/bin下的tomcat6w.exe  如图:

 

Initial memory pool : 指初始化堆内存大小

Maximun memory pool : 指最大堆内存大小

若要设置PermGen池的大小需在Java Option中添加如下参数设置:

Dcatalina.base=%tomcat_home%

-Dcatalina.home=%tomcat_home%

-Djava.endorsed.dirs=%tomcat_home%\endorsed

-Djava.io.tmpdir=%tomcat_home%\temp

-XX:PermSize=256M

-XX:MaxPermSize=256M

-XX:ReservedCodeCacheSize=48M

-Duser.timezone=GMT+08

(PS:网上说每一行后面不要有空格,没试过)

第二种:打开注册表->HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\Java(路径可能有一点点差别)

修改Options的值,把刚才上面那些参数加进去就OK了。(别忘了先备份一下注册表)

3、若在myeclipse中启动tomcat,上面的修改就不起作用。

需在myeclipse中修改即可:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m

 

三、JVM参数说明:

-server : 一定要作为第一个参数,在多个CPU时性能佳

-Xms : java Heap初始大小。 默认为物理内存的1/64

-Xms : java Heap最大值。建议设为物理内存的一半。不可超

-XX:PermSize : 设定内存的永久保存区初始大小,缺省值:64M

-XX:MaxPermSize : 设定内存的永久保存存区最大大小,缺省值:64M

-XX:SurvivorRatio=2 : 生还者池的大小,默值:2,若垃圾回收变成了瓶颈,可尝试定制生成池设置

-XX:NewSize : 新生成的池的初始大小 缺省值:2M

-XX:MaxNewSize : 新生成的池的最大大小。缺省值:32M

若JVM的堆的大小大于1GB,则应该配置:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或将堆的总大小的50%到60%分配给新生成的池。调大新对象区,减少Full GC次数。

+XX:AggressiveHeap : 会使得Xms没有意义。这个参数让JVM忽略Xmx参数。疯狂地吃完一个G物理内存,再吃尽一个G的swap.

-Xss : 每个线程的Stack大小, “-Xss 15120” 这使得JBoss每增加一个线程,就会立即消耗15M内存,而最佳值应该是128K,默认值:512K

-verbose:gc : 现实垃圾收集信息

-Xloggc:gc.log : 指定垃圾收集日志文件

-Xmn : young generation的heap大小,一般设置为Xmx的1/3或1/4.

-XX:+UseParNewGC : 缩短minor收集的时间

-XX:+UseConcMarkSweepGC : 缩短major收集的时间,此选项在Heap Size比较大而且Major收集时间较长的情况下使用更合适。

-XX:userParNewGC : 可用来设置并行收集(多CPU)

-XX:ParallelGCThreads : 可用来增加并行度(多CPU)

-XX:UseParallelGC : 设置后可使用并行清除收集器(多CPU)

 

出处:http://elf8848.iteye.com/blog/378805

转载于:https://www.cnblogs.com/amywang/p/4766603.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

CoreWCF 项目组正式发布 1.0 版本的 CoreWCF, 这是面向 .NET Core 平台的 WCF 移植版本。它支持 SOAP、NetTCP 和 WSDL 的相同实现。在代码中的使用方式于 WCF 相同,但是升级到使用 ASP.NET Core 作为服务宿主,并工作在 .NET Core 平台上。这是该项目的第…

表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决

Hi!大家好!欢迎来到小龙自修室!又到了小龙分享时间!(今天的内容有点多,希望各位看官一定要看到最后!有惊喜)上一篇文字小龙和大家一起制作了一个限定数据内容录入的电子表格,我的表格我做主!表格…

C++入门指南及实战 第三步 基本变量

在C编程中,内置了一些基本数据类型用来存储一些不同类型的值。有字符类型 char 用以存储字符,如a、b、c、d、-、、1、2、4、3、>、?等;有整形 int 用以存储整数类型,如1、2、3、4、5、11、111、2311等;有浮点类型 …

OPCServer Modbus使用和配置

一,安装KEPware.Enhanced.OPC.DDE.KEPServer。(PLC数据传送给KEPServer,开发的程序用OPCServer读KEPServer) 设置ip地址后面是指的plc站号,此处必须和plc上站号对应。否则无法接收数据。 打开quick client 查看传值情况 二.C#程序代码 引用opcdaauto.dll…

C# 创建命名管道服务器

通过创建 NamedPipeServerStream 的一个新实例,来创建服务器。NamedPipeServerStream 派生自基类 PipeStream,PipeStream 派生自 Stream 基类,因此可以使用流的所有功能,例如,可以创建CryptoStream 或 GZipStream&…

在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress

2019独角兽企业重金招聘Python工程师标准>>> 在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress 在Banana Pi BPI-M1上使用OxOffice Impress,該簡報大小約26MB,採用自動播放機制。 OxOffice提供 arm linux的版本,可佈署在ar…

免杀新姿势:利用线程将恶意代码注入到内存中

本文讲的是免杀新姿势:利用线程将恶意代码注入到内存中,产生存放远程攻击线程的进程在这篇文章中我不想一步一步解释我编写的C#代码,但是我会展示下它能够绕过杀毒软件,并且操作非常简单,而且实用。 首先说明一下&…

Java之解决散列表的冲突用开放定址法和链表法

1 问题 理想状态下,散列表就是一个包含关键字的固定大小的数组,通过使用散列函数,将关键字映射到数组的不同位置,哈希函数可以将关键字均匀的分散到数组的不同位置,不会出现两个关键字散列值相同(假设关键…

python 手把手教你基于搜索引擎实现文章查重

前言 文章抄袭在互联网中普遍存在,很多博主都收受其烦。近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制、黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这…

lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法

什么是LRU算法?redis大家都玩过吧,你们好奇redis内存数据存满之后会发生什么吗?抛出异常?禁止使用?还是删除数据?其实redis设计了一种内润淘汰机制。noeviction(默认策略):屏蔽写操作&#xff0…

bzoj3224 Tyvj 1728 普通平衡树题解--Treap

题面: Description您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数&…

Blazor University (18)使用 RenderFragments 模板化组件 —— 创建 TabControl

原文链接:https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/创建一个 TabControl 组件源代码[1]接下来我们将创建一个 TabControl 组件。这将教您如何实现以下目标:将数据传递到 RenderFragment 以为其…

Java之GC机制

1 JVM基本结构 1)类加载器classLoader:在JVM启动时或者类运行时将需要的.class文件加载到内存中 2)内存区域(运行时数据区): 是在JVM运行的时候操作所分配的内存区 3)执行引擎:负…

《零基础看得懂的C语言入门教程 》——(一)脱离学习误区

本节视频连接: https://www.bilibili.com/video/BV1Qv411t7ae 新手C语言学习有些误区你应该知道,这样学习起来事半功倍~一、前言 距离上一次编写C语言的教程是5年前了(2015年),由于自己是从初一时开始学习编程&#…

一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例

学校导视设计案例建筑师Emil Dervish为乌克兰基辅Underhub语言学校设计了色彩缤纷的导视系统,该设计灵感来源于伦敦地铁,他希望通过彩色线条的大胆应用来营造轻松而欢乐的氛围。让我们一起来看看这座由“彩虹”做导视的学校。彩虹导视设计跟着红色导视线…

C# 创建匿名管道

下面对匿名管道执行类似的操作。通过匿名管道,创建两个彼此通信的任务。为了给管道的创建发出信号,使用 ManualResetEventSlim 对象,与内存映射文件一样。在 Program 类的 Run 方法中,创建两个任务,调用 Reader 和 Wri…

内测投票

create table DiaoYanTiMu (  Ids int(10) auto_increment not null primary key(),//把所需要的都写上中间不需要符号隔开,设自增长列类型必须是int,主键的话必须不能为空not null, Title varchar(50) not null );/…

Mysql 查询统计练习

2019独角兽企业重金招聘Python工程师标准>>> 1、建表 customers 顾客表 products 产品表 orders 订单表 -- 顾客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

C++11模版元编程的应用

1.概述 关于C11模板元的基本用法和常用技巧,我在程序员2015年2月B《C11模版元编程》一文(后称前文)中已经做了详细地介绍,那么C11模版元编程用来解决什么实际问题呢,在实际工程中又该如何应用呢?本文将侧重…

《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程

一、学习目标 了解DevC集成开发环境了解集成开发环境了解HelloWorld程序了解HelloWorld程序的编写方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇&#xff1…