JVM
#-Xms6000m :设置JVM初始可用内存为6000MB
#-Xmn2g :设置年轻代大小为2G
#-Xss128k :设置每个线程的堆栈大小为128k
#-XX:NewRatio=4 :设置年轻代与年老代的比值为4
#-XX:SurvivorRatio=4 :设置年轻代中Eden区与Survivor区的大小比值为4
#-XX:PermSize=512m :设置堆栈永久区起始大小为512m
#-XX:MaxPermSize=512m :设置堆栈永久区最大大小为512m
#-XX:MaxTenuringThreshold=0 :设置垃圾最大年龄为0
#-XX:+UseParallelGC :选择垃圾收集器为并行收集器
#-XX:ParallelGCThreads=8 :配置并行收集器的线程数
#-XX:+UseParallelOldGC :配置年老代垃圾收集方式为并行收集
#-XX:+UseAdaptiveSizePolicy :并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时>间或者收集频率等,此值建议使用并行收集器时,一直打开。
JAVA_OPTS='-Xms6000m -Xmx6000m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=0 -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy'
00:02:08 /usr/local/jdk/bin/java -Dresin.home=/usr/local/resin2
-server -Xmx1800M -Xms1800M -Xmn600M -XX:PermSize=200M -XX:MaxPermSize=200M
-XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=3
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=4M
-XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80
-XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC -Xloggc:log/gc.log com.caucho.server.http.HttpServer -socketwait 37992
-stdout /usr/local/resin2/log/stdout.log -stderr /usr/local/resin2/log/stderr.log
XX:+DisableExplicitGC标志自动将System.gc()调用转换成一个空操作,为您提供运行代码的机会,您自己看看System.gc()对于整个JVM执行有害还是有利
XX:+HeapDumpOnOutOfMemoryError在JVM消亡之际捕获堆的一个快照,运行该命令通知JVM拍摄一个“堆转储快照”,并将其保存在一个文件中以便处理,通常使用jhat实用工具
XX:HeapDumpPath标志指定到保存文件的实际路径
-Xms JVM初始化堆的大小
-Xmx JVM堆的最大值
1、java.lang.OutOfMemoryError: PermGen space
JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2、java.lang.OutOfMemoryError: Java heap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收GC的角色
JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:
当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,
一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。
二、JVM内存区域组成
简单的说java中的堆和栈
java把内存分两种:一种是栈内存,另一种是堆内存
1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
2。堆内存用来存放由new创建的对象和数组
在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
java堆分为三个区:New、Old和Permanent
GC有两个线程:
新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn
java栈存放
栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间
每个线程都有他自己的Stack
三、JVM如何设置虚拟内存
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。
简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
四、性能检查工具使用
定位内存泄漏:
JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。
1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位;
2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次;
3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。
因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降,
如果一直居高不下这肯定就因为程序的原因导致内存泄漏。
五、不健壮代码的特征及解决办法
1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。
对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率;
2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;
String str = "aaa";
String str2 = "bbb";
String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销;
3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的;
4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
这是一个案例想定供大家警戒
使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,
检查之后发现问题:组件里的代码
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃
7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
相关推荐
【标题】"002 RJPOS:完成JVM对象的设计" 在Java开发中,理解JVM(Java虚拟机)的工作原理对于优化程序性能、解决内存问题以及深入掌握Java编程至关重要。RJPOS项目中的"完成JVM对象的设计"这一主题,主要探讨了如何...
Java虚拟机(JVM)内存模型是Java程序运行的基础,它包括了多个区域,如堆内存、栈内存、方法区、程序计数器以及本地方法栈。这些区域各自承担着不同的职责,确保Java应用程序能够正常执行。 1. JVM整体结构及内存...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,使得Java具有跨平台的能力。在Java编程中,类加载器(Class Loader)扮演着至关重要的角色,它负责查找并加载Java类到JVM内存中。本部分我们将深入...
002-第一章-JVM课程简介 003-虚拟机概念 004-JVM的定义 005-JVM规范 006-JVM产品 007-JVM发展史上 008-JVM发展史下 009-JVM资料网站 010-JVM整体架构学习路线(1) 010-JVM整体架构学习路线 011-第二章-class文件结构...
├─001-P7程序员面试这样解题数据库索引-1.mp4├─001-P7程序员面试这样解题数据库索引-2.mp4├─001-P7程序员面试这样解题数据库索引-3.mp4├─002-征服99%的面试官的海量数据查询优化解题思路.mp4├─003-烂大街...
在Java中,线程是程序执行的最小单位,由JVM(Java虚拟机)进行调度。理解Java线程对于开发高效、响应迅速的并发应用程序至关重要。 Java线程的创建主要有两种方式: 1. 继承`Thread`类:创建一个新的类,该类继承...
首先,Java是面向对象的编程语言,其特性如平台独立性(通过Java虚拟机JVM运行)、内存管理和异常处理等,在游戏开发中扮演着关键角色。在设计打飞机游戏时,我们利用类和对象来构建游戏中的各个元素,如飞机、子弹...
- **JVM**:了解Java虚拟机的工作原理及其内存模型。 #### 2. Web基础 - **HTTP协议**:理解HTTP请求/响应模型、状态码含义等。 - **HTML/CSS/JavaScript**:掌握基本网页设计技能。 - **前端框架**:如Bootstrap、...
在"day002 JAVA语法基础-数组入门"的学习中,我们将深入理解数组的概念、定义、初始化以及基本操作。 首先,数组是计算机内存中连续分配的一块区域,用于存储同类型的数据。它由四个主要组成部分组成:数组名,用于...
Eclipse的使用包括新建Java工程,设置项目属性,编写源代码,使用内置的编译器进行编译,以及使用Java虚拟机(JVM)运行程序。开发者还可以利用Eclipse的插件机制,扩展其功能以适应各种特定的开发需求,如Web应用、...
【ST0247-002】是一个与Java编程相关的资源,可能是一个项目、教程或者代码库。由于提供的信息有限,我们将从Java语言的基础到高级特性,以及相关的开发实践来探讨这个主题。 1. **Java简介** Java是一种广泛使用...
Java虚拟机(JVM)使得Java程序可以在任何安装了JVM的平台上运行,实现了跨平台性。 2. **网络安全**:网络安全主要关注保护网络系统和数据免受未经授权的访问、攻击或破坏。在Java编程中,网络安全涉及加密、认证...
8. **JVM(Java虚拟机)**:Java代码编译成字节码后,由JVM负责解释执行,实现了“一次编写,到处运行”的跨平台特性。 9. **Java SE, Java EE, Java ME**:Java分为三个版本,Java Standard Edition用于桌面应用,...
100.002可能是“安装和配置Java环境”,指导如何设置开发环境;100.003可能是“变量和数据类型”;100.004可能是“运算符和表达式”;100.005可能是“流程控制”;100.006可能是“类与对象”;100.007可能是“封装”...
大厂面试题第一季-阿里篇-002-征服99%的面试官的海量数据查询优化解题思路.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题才能秒杀面试官-1.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题...
大厂面试题第一季-阿里篇-002-征服99%的面试官的海量数据查询优化解题思路.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题才能秒杀面试官-1.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题...
大厂面试题第一季-阿里篇-002-征服99%的面试官的海量数据查询优化解题思路.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题才能秒杀面试官-1.mp4 大厂面试题第一季-阿里篇-003-烂大街的HashMap如何解题...
2. **编译产物**:.class文件是Java源代码经过编译后的结果,Java虚拟机(JVM)读取这些文件来运行程序。 3. **项目结构**:典型的Java项目会有如src/main/java、src/test/java等目录结构,分别存放源代码和测试...
WebLogic应用优化解决方案是针对Oracle WebLogic Server这一企业级Java EE应用服务器的性能...AS002-WebLogic应用优化解决方案 20070420.PDF文件可能提供了更详细的指导和案例,建议进一步阅读以获取更全面的优化策略。