JVM(java虚拟机)其实就是操做系统(如windows)上的一个普通程序(进程名叫java,这个程序能够解释执行class文件)。
当java进程启动时会首先分配一块堆内存(最小内存),之后每当class字节码程序要求JVM(java进程)分配内存时,JVM
就会在预先分配的那块内存上面为class字节码程序分配内存,当预先分配的那块内存用没时,JVM会再向操做系统要内存
(物理内存), 可是JVM不会无限制的向操做系统要内存,当它占用的实际堆内存达到一个预约值(最大可用内存)时,
若是class字节码程序还向JVM要内存,而且JVM没法经过回收当前堆中的内存来为class字节码程序服务时,它就会给程
序抛出java.lang.OutOfMemoryError。其中内存回收时机并非再用掉内存达到最大可用内存时才进行,他的运行时机是
不肯定的,可见JVM的最大可用内存就是你的java程序(class字节码程序)可以使用的最大内存。
例如:你把jvm最大可用内存设为200M,而你的物理内存1G.在这种程序下你的class程序最多能使用200M内存,虽然你可能
还有800M内存可用,可是当你的程序用掉200M后若是再要内存,JVM不会由于你还有800M内存而为你分配内存,他会向你抛
出java.lang.OutOfMemoryError .
因此JVM最大可用内存参数比较重要。
通常建议堆的最大值设置为可用内存的最大值的80%。
(如下为转网络)
Tomcat默承认以使用的内存为64MB,在较大型的应用项目中,这点内存是不够的,须要调大。
Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,
增长以下设置:
set JAVA_OPTS=-Xms【初始化内存大小】 -Xmx【可使用的最大内存】
须要把这个两个参数值调大。例如: set JAVA_OPTS=-Xms64m -Xmx256m
表示初始化内存为256MB,可使用的最大内存为512MB。
另外须要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可
以接受的速度与应用有关,应该经过分析实际的垃圾收集的时间和频率来调整。若是堆的大小很大,那么彻底垃圾收集就
会很慢,可是频度会下降。若是你把堆的大小和内存的须要一致,彻底收集就很快,可是会更加频繁。调整堆大小的的目
的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆
的大小设大,保证垃圾收集不在整个基准测试的过程当中出现。
若是系统花费不少的时间收集垃圾,请减少堆大小。一次彻底的垃圾收集应该不超过 3-5 秒。若是垃圾收集成为瓶颈,那
么须要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。通常说来,你应该使用物理内存
的 80% 做为堆大小。当增长处理器时,记得增长内存,由于分配能够并行进行,而垃圾收集不是并行的。
-Xms : 应用程序初始化内存大写,注意是你的某一个应用程序,多个应用程序将生成多个JVM实例
-Xmx: 应用程序占用内存的最大值,将不能超过这个值,不然可能致使OutOfMemory.
-XX:NewRatio old generation/new generation 的比例
推荐的-Xms -Xmx设置成同样,,为系统内存的80%.这样,不用每次GC清理完再从新分配.
而-XX:NewRatio为2 好比: -Xms384m -Xmx384m -XX:NewRatio=2java