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

Tomcat相关 -- 内存设置相关推荐

  1. Tomcat启动内存设置

    Tomcat启动内存设置 Tomcat的启动分为startupo.bat启动和注册为windows服务的启动,下面一一说明. 1.startup.bat启动 在tomcat_home/bin目录下找到 ...

  2. linux tomcat java heap space_Linux下tomcat JVM内存设置

    常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space ...

  3. linux查看tomcat启动内存溢出,关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论-Fun言...

    一:乱码问题1(前端通过url方式传递中文参数后台收到的是????) 此为Tomcat根目录-conif-server.xml 中 connectionTimeout="20000″ red ...

  4. linux 查看java最大内存配置,Linux和Windows下的内存设置

    你对Tomcat JVM内存设置是否了解,本文向大家介绍一下Linux和Windows操作系统下Tomcat JVM内存设置方法,希望对你的学习有所帮助. Linux下修改Tomcat JVM内存设置 ...

  5. 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法

    1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ...

  6. 服务器上tomcat修改内存,8g服务器tomcat内存设置

    8g服务器tomcat内存设置 内容精选 换一换 系统每30秒周期性检测HBase服务堆内存使用状态,当检测到HBase服务堆内存使用率超出阈值(最大内存的90%)时产生该告警.若集群启用了多实例功能 ...

  7. 从JVM的常见异常来看Tomcat中内存的设置

    一.Tomcat和JDK的关系: 1. Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java 虚拟机. 2. JAVA程序启动时JVM都会分配一个初始内存和最大内存给 ...

  8. 《转载》Tomcat内存设置详解

    原文地址:Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 ...

  9. java tomcat 内存设置,tomcat下java的内存设置

    服务器在windowst平台下,运行tomcat跑java,可最近出现 java.lang.OutOfMemoryError: GC overhead limit exceeded 错误,网上goog ...

最新文章

  1. 用人脑生成等概率随机数,困扰人类30万年的问题解决了 | 附“源代码”
  2. 无法加载mspdb140.dll
  3. Kubernetes 选择 IPVS
  4. Fibonacci(求前四位数)
  5. Oracle学习 第26天 Toad试用感受
  6. Win10错误代码0x80070541是怎么回事
  7. Tunnels 状压DP+BFS
  8. python制作翻译器代码_翻译器(3)
  9. VisualStudio2022创建.ASP.NET应用程序
  10. 九九乘法表(c语言)
  11. LAMP兄弟连ThinkPHP笔记
  12. 模型压缩——重参数化
  13. java时间和电脑时间_Java语言程序设计(三)显示电脑系统当前时间
  14. 南方电网电费充值源码文档
  15. 眼见为实:关于微服务熔断这几个知识点,你可能理解错了
  16. Java Web实现 使用浏览器从服务器下载文件
  17. python中面向对象的思想汇报_python试卷
  18. 聊聊心理学专业去用户体验研究方向的求职
  19. 泛函分析简列:度量空间之列紧集
  20. cst是什么时间(Cst是什么检查)

热门文章

  1. Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库
  2. Spring Security(18)——Jsp标签
  3. java中的动态代理----自己手动实现
  4. 函数_方法_的四种调用方式
  5. Integer 中的缓存类IntegerCache
  6. [转]JS Cookie 中文乱码
  7. SparkContext: Error initializing SparkContext解决方法
  8. oracle t7-2报价,Sun/Oracle T7-2服务器主板7315607全新7318270原装7318240
  9. vue路由添加.html,怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由
  10. html form src,form.html