• 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

  • 相关阅读:
    ABC221
    ABC216
    ABC218
    ABC223
    ABC220
    聊聊并发(七)——锁 Craftsman
    (一)推荐阅读 Craftsman
    聊聊并发(五)——线程池 Craftsman
    (二)工作三年的一些感悟 Craftsman
    Java基础(八)——IO流1_字节流、字符流 Craftsman
  • 原文地址:https://www.cnblogs.com/a-really/p/3244031.html
Copyright © 2020-2023  润新知