小名色素

导航

java虚拟机使用内存的思考(转载)

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=2

posted on 2013-08-07 19:30  小名色素  阅读(327)  评论(0编辑  收藏  举报