win7做本地网站,济南哪个公司做网站好,seo工作,wordpress动态页面 收录java内存溢出详解 一、常见的java内存溢出 1、java.lang.OutOfMemmoryError : Java heap space -- JVM Heap #xff08;jvm 堆溢出#xff09; JVM启动时自动设置JVM Heap的值#xff0c;其初始空间(即 -Xms)是物理内存的1/64#xff0c;最大空间(-Xms)不可超过物理内存。…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 位置cygwinfalse前 JAVA_OPTS-server -Xms256 -Xmx512m -XX:PermSize64M -XX:MaxPermSize128m 2、window下的tomcat 因window下的tomcat启动分为startup.bat启动和注册成了windows服务以services方式启动。r所以修改方式不同。 1startup.bat启动 在TOMCAT_HOME/bin下找到catalina.bat,用文本编辑器打开并加上一行 set JAVA_OPTS -server -Xms1024M -Xmx1024M -XX:PermSize256M -XX:MaxNewSize256M -XX:MaxPermSize256M 说明加上 -server 是指启动jvm时以服务器方式启动比客户端启动慢但性能较好可以自己选择。 2windows服务启动 若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:PermSize256M -XX:MaxPermSize256M -XX:ReservedCodeCacheSize48M -Duser.timezoneGMT08 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:PermSize64M -XX:MaxPermSize128m 三、JVM参数说明 -server : 一定要作为第一个参数在多个CPU时性能佳 -Xms : java Heap初始大小。 默认为物理内存的1/64 -Xms : java Heap最大值。建议设为物理内存的一半。不可超 -XX:PermSize : 设定内存的永久保存区初始大小缺省值64M -XX:MaxPermSize 设定内存的永久保存存区最大大小缺省值64M -XX:SurvivorRatio2 : 生还者池的大小默值2若垃圾回收变成了瓶颈可尝试定制生成池设置 -XX:NewSize : 新生成的池的初始大小 缺省值2M -XX:MaxNewSize : 新生成的池的最大大小。缺省值32M 若JVM的堆的大小大于1GB则应该配置-XX:newSize640m -XX:MaxNewSize640m -XX:SurvivorRatio16或将堆的总大小的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