精华内容
下载资源
问答
  • JVM内存设置多大合适?Xmx和Xmn如何设置?JVM内存分配比例
    千次阅读
    2019-05-23 10:41:15
    更多相关内容
  • Tomcat JVM内存设置方法

    2018-07-17 11:52:21
    Tomcat JVM虚拟机默认内存1800 M左右,当服务内存不够用时,需要手动设置内存大小,不可超过服务器系统内存的80%,本文档提供设置方法(使用命令启动有效),实测可用。
  • JVM内存设置

    2014-12-11 19:49:03
    Jvm常用内存设置,感觉比较有用,收藏下来。
  • 2)JVM内存限制(最大值) 首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 这...

    Eclipse崩溃,错误提示:

    MyEclipse has detected that less than 5% of the 64MB of Perm

    Gen (Non-heap memory) space remains. It is strongly recommended

    that you exit and restart MyEclipse with new virtual machine memory

    paramters to increase this memory.   Failure to do so can result in

    data loss. The recommended Eclipse memory parameters are:

    eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

    1.参数的含义

    -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

    -vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了

    -Xms128m JVM初始分配的堆内存

    -Xmx512m JVM最大允许分配的堆内存,按需分配

    -XX:PermSize=64M JVM初始分配的非堆内存

    -XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

    我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。

    1)堆(Heap)和非堆(Non-heap)内存

    按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。

    可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,

    所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

    堆内存分配

    JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;

    空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。

    说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。

    非堆内存分配

    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关,

    -server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有实验。)

    上面错误信息中的PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。还没有弄明白PermGen space是属于非堆内存,还是就是非堆内存,但至少是属于了。

    XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。

    说说为什么会内存益出:

    (1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。

    (2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。

    这种错误常见在web服务器对JSP进行pre compile的时候。

    2)JVM内存限制(最大值)

    首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,

    这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

    2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

    通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:

    1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

    2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,

    如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

    3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

    那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:

    参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机,

    在eclipse.ini文件中要写成这样:

    -vm

    C:/Java/jre1.6.0/bin/javaw.exe

    -vmargs

    -Xms128M

    -Xmx512M

    -XX:PermSize=64M

    -XX:MaxPermSize=128M

    实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。

    另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:

    -showsplash

    org.eclipse.platform

    --launcher.XXMaxPermSize

    256m

    -vmargs

    -Xms40m

    -Xmx256m

    其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,

    而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

    4. 其他的启动参数。 如果你有一个双核的CPU,也许可以尝试这个参数:

    -XX:+UseParallelGC

    让GC可以更快的执行。(只是JDK 5里对GC新增加的参数)

    补充:

    如果你的WEB APP下都用了大量的第三方jar,其大小超过了服务器jvm默认的大小,那么就会产生内存益出问题了。

    解决方法: 设置MaxPermSize大小

    可以在myelipse里选中相应的服务器比如tomcat5,展开里面的JDK子项页面,来增加服务器启动的JVM参数设置:

    -Xms128m

    -Xmx256m

    -XX:PermSize=128M

    -XX:MaxNewSize=256m

    -XX:MaxPermSize=256m

    或者手动设置MaxPermSize大小,比如tomcat,

    修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:

    JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

    建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存

    展开全文
  • 新上线一个java服务,或者是RPC或者是WEB站点, 内存设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析: 依据的原则是根据Java Performance里面的推荐公式来进行设置。 296d...

    问题:
    新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢?

    分析:
    依据的原则是根据Java Performance里面的推荐公式来进行设置。

     

     

    具体来讲:
    Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
    永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。
    年轻代Xmn的设置为老年代存活对象的1-1.5倍。
    老年代的内存大小设置为老年代存活对象的2-3倍。

    BTW:
    1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。
    2、堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小 。 Permsize不影响堆大小。
    3、为什么要按照上面的来进行设置呢? 没有具体的说明,但应该是根据多种调优之后得出的一个结论。

    如何确认老年代存活对象大小?
    方式1(推荐/比较稳妥):
    JVM参数中添加GC日志,GC日志中会记录每次FullGC之后各代的内存大小,观察老年代GC之后的空间大小。可观察一段时间内(比如2天)的FullGC之后的内存情况,根据多次的FullGC之后的老年代的空间大小数据来预估FullGC之后老年代的存活对象大小(可根据多次FullGC之后的内存大小取平均值)

    方式2:(强制触发FullGC, 会影响线上服务,慎用)
    方式1的方式比较可行,但需要更改JVM参数,并分析日志。同时,在使用CMS回收器的时候,有可能不能触发FullGC(只发生CMS GC),所以日志中并没有记录FullGC的日志。在分析的时候就比较难处理。
    BTW:使用jstat -gcutil工具来看FullGC的时候, CMS GC是会造成2次的FullGC次数增加。 具体可参见之前写的一篇关于jstat使用的文章
    所以,有时候需要强制触发一次FullGC,来观察FullGC之后的老年代存活对象大小。
    注:强制触发FullGC,会造成线上服务停顿(STW),要谨慎,建议的操作方式为,在强制FullGC前先把服务节点摘除,FullGC之后再将服务挂回可用节点,对外提供服务
    在不同时间段触发FullGC,根据多次FullGC之后的老年代内存情况来预估FullGC之后的老年代存活对象大小

    如何触发FullGC ?
    使用jmap工具可触发FullGC
    jmap -dump:live,format=b,file=heap.bin <pid> 将当前的存活对象dump到文件,此时会触发FullGC
    jmap -histo:live <pid> 打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC

    具体操作实例:
    以我司的一个RPC服务为例。
    BTW:刚上线的新服务,不知道该设置多大的内存的时候,可以先多设置一点内存,然后根据GC之后的情况来进行分析。
    初始JVM内存参数设置为: Xmx=2G Xms=2G xmn=1G

    使用jstat 查看当前的GC情况。如下图:

     

     

    YGC平均耗时: 173.825s/15799=11ms
    FGC平均耗时:0.817s/41=19.9ms
    平均大约10-20s会产生一次YGC

    看起来似乎不错,YGC触发的频率不高,FGC的耗时也不高,但这样的内存设置是不是有些浪费呢?
    为了快速看数据,我们使用了方式2,产生了几次FullGC,FullGC之后,使用的jmap -heap 来看的当前的堆内存情况(也可以根据GC日志来看)
    heap情况如下图:(命令 : jmap -heap <pid>)

     

     

    上图中的concurrent mark-sweep generation即为老年代的内存描述。
    老年代的内存占用为100M左右。 按照整个堆大小是老年代(FullGC)之后的3-4倍计算的话,设置各代的内存情况如下:
    Xmx=512m Xms=512m Xmn=128m PermSize=128m 老年代的大小为 (512-128=384m)为老年代存活对象大小的3倍左右
    调整之后的,heap情况

     

     

    GC情况如下:

     

     

    YGC 差不多在10s左右触发一次。每次YGC平均耗时大约9.41ms。可接受。
    FGC平均耗时:0.016s/2=8ms
    整体的GC耗时减少。但GC频率比之前的2G时的要多了一些。

    注: 看上述GC的时候,发现YGC的次数突然会增多很多个,比如 从1359次到了1364次。具体原因是?

    总结:
    在内存相对紧张的情况下,可以按照上述的方式来进行内存的调优, 找到一个在GC频率和GC耗时上都可接受的一个内存设置,可以用较小的内存满足当前的服务需要
    但当内存相对宽裕的时候,可以相对给服务多增加一点内存,可以减少GC的频率,GC的耗时相应会增加一些。 一般要求低延时的可以考虑多设置一点内存, 对延时要求不高的,可以按照上述方式设置较小内存。

    补充:
    永久代(方法区)并不在堆内,所以之前有看过一篇文章中描述的 整个堆大小=年轻代+年老代+永久代的描述是不正确的。

    展开全文
  • 深入学习JVM内存设置原理和调优

    千次阅读 2016-06-03 16:41:50
    你知道JVM内存设置原理吗,这里和大家分享一下,因为如果默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。 这里向大家描述一下JVM内存设置原理和内存调优...

    你知道JVM内存设置原理吗,这里和大家分享一下,因为如果默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。


    这里向大家描述一下JVM内存设置原理和内存调优,设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。

    JVM内存设置原理

    默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。

    java-Xms64m-Xmx256mTest

    -Xms是设置内存初始化的大小

    -Xmx是JVM内存设置中设置最大能够使用内存的大小(最好不要超过物理内存大小)

    在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。简单介绍了JVM内存设置,下面我们看一下JVM内存的调优。

    JVM内存的调优

    1.Heap设定与垃圾回收

    JavaHeap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。JVM的Heap分配可以使用-X参数设定,

    JVM有2个GC线程。

    第一个线程负责回收Heap的Young区。

    第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

    为什么一些程序频繁发生GC?有如下原因:

    ◆程序内调用了System.gc()或Runtime.gc()。

    ◆一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。

    ◆Java的Heap太小,一般默认的Heap值都很小。

    ◆频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。

    如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。

    经验之谈:

    1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2]。

    2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成[2]。

    注意:

    1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。

    2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

    2.Stack的设定

    每个线程都有他自己的Stack。

    Xss每个线程的Stack大小

    Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。

    3.硬件环境

    硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
    如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。

    4.4种GC

    第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。

    第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。

    第三种为ConcurrentLowPauseGC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。

    第四种为IncrementalLowPauseGC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。

    4种GC的具体描述参见[3]。

    /******************************************/

    一、设置JVM内存设置

    1. 设置JVM内存的参数有四个:

    -Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

    -Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

    -Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

    -Xss   每个线程的Stack大小,不熟悉最好保留默认值;

    2. 如何设置JVM内存分配:

    (1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):

    java -Xmx128m -Xms64m -Xmn32m -Xss16m Test

    (2)当在集成开发环境下(如eclipse)启动并使用JVM时:

    a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):

    1. -vmargs  
    2. -Xms40m  
    3. -Xmx256m 

    -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。

    此处设置的参数值可以通过以下配置在开发工具的状态栏显示:

    在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true

    修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:

    1. -debug  
    2. options  
    3. -vm  
    4. javaw.exe 

    重新启动eclipse,就可以看到下方状态条多了JVM信息。

    b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

    编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

    c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)

    选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

    注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:

    开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:

    -Xmx256m -Xms64m

    (3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):

    a. 设置环境变量:

    变量名:CATALINA_OPTS

    变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m

    b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中的�TALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m

    二、查看设置JVM内存信息

    Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx

    Runtime.getRuntime().freeMemory(); //当前JVM空闲内存

    Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和

    关于maxMemory(),freeMemory()和totalMemory():

    maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;

    totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;

    freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而 JVM实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()。及其 设置JVM内存分配。

    官方文档见:

    http://docs.sun.com/source/819-0084/pt_tuningjava.html

    java启动参数共分为三类;
    其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
    其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
    其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

    标准参数中比较有用的:

    verbose 
    -verbose:class
     
     输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
    -verbose:gc 
     输出每次GC的相关情况。
    -verbose:jni 
     输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

    非标准参数又称为扩展参数

    一般用到最多的是

    -Xms512m  设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

    -Xmx512m ,设置JVM最大可用内存为512M。

    -Xmn200m设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

    -Xss128k:

    设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

     

     

    -Xloggc:file
     与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
     若与verbose命令同时出现在命令行中,则以-Xloggc为准。
    -Xprof

     跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

    用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了;但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX:PermSize、-XX:MaxPermSize等等;

     

    首先来介绍行为参数

    参数及其默认值 描述
    -XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
    -XX:+MaxFDLimit 最大化文件描述符的数量限制
    -XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
    -XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
    -XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
    -XX:-UseParallelGC 启用并行GC
    -XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
    -XX:-UseSerialGC 启用串行GC
    -XX:+UseThreadPriorities 启用本地线程优先级

     

    上面表格中黑体的三个参数代表着jvm中GC执行的三种方式,即串行、并行、并发
    串行(SerialGC)是jvm的默认GC方式,一般适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿;
    并行(ParallelGC)是指GC运行时,对应用程序运行没有影响,GC和app两者的线程在并发执行,这样可以最大限度不影响app的运行;
    并发(ConcMarkSweepGC)是指多个线程并发执行GC,一般适用于多处理器系统中,可以提高GC的效率,但算法复杂,系统消耗较大;

     

    性能调优参数列表:

    参数及其默认值 描述
    -XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
    -XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
    -XX:MaxNewSize=size 新生成对象能占用内存的最大值
    -XX:MaxPermSize=64m 老生代对象能占用内存的最大值
    -XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
    -XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
    -XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
    -XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
    -XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
    -XX:+UseLargePages 使用大页面内存

     

     我们在日常性能调优中基本上都会用到以上黑体的这几个属性; 

     

    调试参数列表:

    参数及其默认值 描述
    -XX:-CITime 打印消耗在JIT编译的时间
    -XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
    -XX:-ExtendedDTraceProbes 开启solaris特有的dtrace探针
    -XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
    -XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
    -XX: 出现致命ERROR之后运行自定义命令
    -XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
    -XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
    -XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
    -XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
    -XX:-PrintCompilation 当一个方法被编译时打印相关信息
    -XX:-PrintGC 每次GC时打印相关信息
    -XX:-PrintGC Details 每次GC时打印详细信息
    -XX:-PrintGCTimeStamps 打印每次GC的时间戳
    -XX:-TraceClassLoading 跟踪类的加载信息
    -XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
    -XX:-TraceClassResolution 跟踪常量池
    -XX:-TraceClassUnloading 跟踪类的卸载信息
    -XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息

     

    补充:

    一、JVM内存的构

    Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法。总体分为下面几个部分:

    程序计数器(Program Counter Register)、JVM虚拟机栈(JVM Stacks)、本地方法栈(Native Method Stacks)、堆(Heap)、方法区(Method Area)

    如下图:

    1、程序计数器(Program Counter Register)

    这是一块比较小的内存,不在Ram上,而是直接划分在CPU上的,程序员无法直接操作它,它的作用是:JVM在解释字节码文件(.class)时,存储当前线程所执行的字节码的行号,只是一种概念模型,各种JVM所采用的方式不同,字节码解释器工作时,就是通过改变程序计数器的值来选取下一条要执行的指令,分支、循环、跳转、等基础功能都是依赖此技术区完成的。还有一种情况,就是我们常说的Java多线程方面的,多线程就是通过现程轮流切换而达到的,同一时刻,一个内核只能执行一个指令,所以,对于每一个程序来说,必须有一个计数器来记录程序的执行进度,这样,当现程恢复执行的时候,才能从正确的地方开始,所以,每个线程都必须有一个独立的程序计数器,这类计数器为线程私有的内存。如果一个线程正在执行一个Java方法,则计数器记录的是字节码的指令的地址,如果执行的一个Native方法,则计数器的记录为空,此内存区是唯一一个在Java规范中没有任何OutOfMemoryError情况的区域。

    2、JVM虚拟机栈(JVM Stacks)

    JVM虚拟机栈就是我们常说的堆栈的栈(我们常常把内存粗略分为堆和栈),和程序计数器一样,也是线程私有的,生命周期和线程一样,每个方法被执行的时候会产生一个栈帧,用于存储局部变量表、动态链接、操作数、方法出口等信息。方法的执行过程就是栈帧在JVM中出栈和入栈的过程。局部变量表中存放的是各种基本数据类型,如boolean、byte、char、等8种,及引用类型(存放的是指向各个对象的内存地址),因此,它有一个特点:内存空间可以在编译期间就确定,运行期不在改变。这个内存区域会有两种可能的Java异常:StackOverFlowError和OutOfMemoryError。

    3、本地方法栈(Native Method Stacks)

    从名字即可看出,本地方法栈就是用来处理Java中的本地方法的,Java类的祖先类Object中有众多Native方法,如hashCode()、wait()等,他们的执行很多时候是借助于操作系统,但是JVM需要对他们做一些规范,来处理他们的执行过程。此区域,可以有不同的实现方法,向我们常用的Sun的JVM就是本地方法栈和JVM虚拟机栈是同一个。

    4、堆(Heap)

    堆内存是内存中最重要的一块,也是最有必要进行深究的一部分。因为Java性能的优化,主要就是针对这部分内存的。所有的对象实例及数组都是在堆上面分配的(随着JIT技术的逐渐成熟,这句话视乎有些绝对,不过至少目前还基本是这样的),可通过-Xmx和-Xms来控制堆的大小。JIT技术的发展产生了新的技术,如栈上分配和标量替换,也许在不久的几年里,即时编译会诞生及成熟,那个时候,“所有的对象实例及数组都是在堆上面分配的”这句话就应该稍微改改了。堆内存是垃圾回收的主要区域,所以在下文垃圾回收板块会重点介绍,此处只做概念方面的解释。在32位系统上最大为2G,64位系统上无限制。可通过-Xms和-Xmx控制,-Xms为JVM启动时申请的最小Heap内存,-Xmx为JVM可申请的最大Heap内存。

    5、方法区(Method Area)

     方法区是所有线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量等数据,一般来说,方法区属于持久代(关于持久代,会在GC部分详细介绍,除了持久代,还有新生代和旧生代),也难怪Java规范将方法区描述为堆的一个逻辑部分,但是它不是堆。方法区的垃圾回收比较棘手,就算是Sun的HotSpot VM在这方面也没有做得多么完美。此处引入方法区中一个重要的概念:运行时常量池。主要用于存放在编译过程中产生的字面量(字面量简单理解就是常量)和引用。一般情况,常量的内存分配在编译期间就能确定,但不一定全是,有一些可能就是运行时也可将常量放入常量池中,如String类中有个Native方法intern()<关于intern()的详细说明,请看另一篇文章:http://blog.csdn.net/zhangerqing/article/details/8093919>

    此处补充一个在JVM内存管理之外的一个内存区:直接内存。在JDK1.4中新加入类NIO类,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,即我们所说的直接内存,这样在某些场景中会提高程序的性能。

    二、垃圾回收

    有句话说的好:Java和C++之间有一堵有内存分配和垃圾回收技术围成的墙,墙外的人想进去,墙里的人想出去!这句话的意思,请读者自己去琢磨。总的来说,C、C++程序员有时苦于内存泄露,内存管理是件令人头痛的事儿,但是Java程序员呢,又羡慕C++程序员,自己可以控制一切,这样就不会在内存管理方面显得束手无策,的却如此,作为Java程序员我们很难去控制JVM的内存回收,只能根据它的原理去适应,尽量提高程序的性能。下面开始讲解Java垃圾回收,即Garbage Collection,GC。从以下四个方面进行:

    1、为什么要进行垃圾回收?

    随着程序的运行,内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要的系统异常。

    2、哪些“垃圾”需要回收?

    在我们上面介绍的五大区中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC。具体到哪些对象的话,简单概况一句话:如果某个对象已经不存在任何引用,那么它可以被回收。通俗解释一下就是说,如果一个对象,已经没有什么作用了,就可以被当废弃物被回收了。

    3、什么时候进行垃圾回收?

    根据一个经典的引用计数算法,每个对象添加一个引用计数器,每被引用一次,计数器加1,失去引用,计数器减1,当计数器在一段时间内保持为0时,该对象就认为是可以被回收得了。但是,这个算法有明显的缺陷:当两个对象相互引用,但是二者已经没有作用时,按照常规,应该对其进行垃圾回收,但是其相互引用,又不符合垃圾回收的条件,因此无法完美处理这块内存清理,因此Sun的JVM并没有采用引用计数算法来进行垃圾回收。而是采用一个叫:根搜索算法,如下图:

    基本思想就是:从一个叫GC Roots的对象开始,向下搜索,如果一个对象不能到达GC Roots对象的时候,说明它已经不再被引用,即可被进行垃圾回收(此处 暂且这样理解,其实事实还有一些不同,当一个对象不再被引用时,并没有完全“死亡”,如果类重写了finalize()方法,且没有被系统调用过,那么系统会调用一次finalize()方法,以完成最后的工作,在这期间,如果可以将对象重新与任何一个和GC Roots有引用的对象相关联,则该对象可以“重生”,如果不可以,那么就说明彻底可以被回收了),如上图中的Object5、Object6、Object7,虽然它们3个依然可能相互引用,但是总体来说,它们已经没有作用了,这样就解决了引用计数算法无法解决的问题。

    补充引用的概念:JDK 1.2之后,对引用进行了扩充,引入了强、软、若、虚四种引用,被标记为这四种引用的对象,在GC时分别有不同的意义:

        a> 强引用(Strong Reference).就是为刚被new出来的对象所加的引用,它的特点就是,永远不会被回收。

        b> 软引用(Soft Reference).声明为软引用的类,是可被回收的对象,如果JVM内存并不紧张,这类对象可以不被回收,如果内存紧张,则会被回收。此处有一个问题,既然被引用为软引用的对象可以回收,为什么不去回收呢?其实我们知道,Java中是存在缓存机制的,就拿字面量缓存来说,有些时候,缓存的对象就是当前可有可无的,只是留在内存中如果还有需要,则不需要重新分配内存即可使用,因此,这些对象即可被引用为软引用,方便使用,提高程序性能。

        c> 弱引用(Weak Reference).弱引用的对象就是一定需要进行垃圾回收的,不管内存是否紧张,当进行GC时,标记为弱引用的对象一定会被清理回收。

        d> 虚引用(Phantom Reference).虚引用弱的可以忽略不计,JVM完全不会在乎虚引用,其唯一作用就是做一些跟踪记录,辅助finalize函数的使用。

    最后总结,什么样的类需要回收呢?无用的类,何为无用的类?需满足如下要求:

       1> 该类的所有实例对象都已经被回收。

       2> 加载该类的ClassLoader已经被回收。

       3> 该类对应的反射类java.lang.Class对象没有被任何地方引用。

    4、如何进行垃圾回收?

    本块内容以介绍垃圾回收算法为主,因为我们前面有介绍,内存主要被分为三块,新生代、旧生代、持久代。三代的特点不同,造就了他们所用的GC算法不同,新生代适合那些生命周期较短,频繁创建及销毁的对象,旧生代适合生命周期相对较长的对象,持久代在Sun HotSpot中就是指方法区(有些JVM中根本就没有持久代这中说法)。首先介绍下新生代、旧生代、持久代的概念及特点:

    新生代:New Generation或者Young Generation。上面大致分为Eden区和Survivor区,Survivor区又分为大小相同的两部分:FromSpace 和ToSpace。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代的大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例.
    旧生代:Old Generation。用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象。旧生代占用大小为-Xmx值减去-Xmn对应的值。

    持久代:Permanent Generation。在Sun的JVM中就是方法区的意思,尽管有些JVM大多没有这一代。主要存放常量及类的一些信息默认最小值为16MB,最大值为64MB,可通过-XX:PermSize及-XX:MaxPermSize来设置最小值和最大值。

    常见的GC算法:

    标记-清除算法(Mark-Sweep)

    最基础的GC算法,将需要进行回收的对象做标记,之后扫描,有标记的进行回收,这样就产生两个步骤:标记和清除。这个算法效率不高,而且在清理完成后会产生内存碎片,这样,如果有大对象需要连续的内存空间时,还需要进行碎片整理,所以,此算法需要改进。

    复制算法(Copying)

    前面我们谈过,新生代内存分为了三份,Eden区和2块Survivor区,一般Sun的JVM会将Eden区和Survivor区的比例调为8:1,保证有一块Survivor区是空闲的,这样,在垃圾回收的时候,将不需要进行回收的对象放在空闲的Survivor区,然后将Eden区和第一块Survivor区进行完全清理,这样有一个问题,就是如果第二块Survivor区的空间不够大怎么办?这个时候,就需要当Survivor区不够用的时候,暂时借持久代的内存用一下。此算法适用于新生代

    标记-整理(或叫压缩)算法(Mark-Compact)

    和标记-清楚算法前半段一样,只是在标记了不需要进行回收的对象后,将标记过的对象移动到一起,使得内存连续,这样,只要将标记边界以外的内存清理就行了。此算法适用于持久代

    常见的垃圾收集器: 

    根据上面说的诸多算法,每天JVM都有不同的实现,我们先来看看常见的一些垃圾收集器:

    首先介绍三种实际的垃圾回收器:串行GC(SerialGC)、并行回收GC(Parallel Scavenge)和并行GC(ParNew)。

    1、Serial GC。是最基本、最古老的收集器,但是现在依然被广泛使用,是一种单线程垃圾回收机制,而且不仅如此,它最大的特点就是在进行垃圾回收的时候,需要将所有正在执行的线程暂停(Stop The World),对于有些应用这是难以接受的,但是我们可以这样想,只要我们能够做到将它所停顿的时间控制在N个毫秒范围内,大多数应用我们还是可以接受的,而且事实是它并没有让我们失望,几十毫米的停顿我们作为客户机(Client)是完全可以接受的,该收集器适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。

    2、ParNew GC。基本和Serial GC一样,但本质区别是加入了多线程机制,提高了效率,这样它就可以被用在服务器端(Server)上,同时它可以与CMS GC配合,所以,更加有理由将它置于Server端。

    3、Parallel Scavenge GC。在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。以下给出几组使用组合:

    4、CMS (Concurrent Mark Sweep)收集器。该收集器目标就是解决Serial GC 的停顿问题,以达到最短回收时间。常见的B/S架构的应用就适合用这种收集器,因为其高并发、高响应的特点。CMS收集器是基于“标记-清除”算法实现的,整个收集过程大致分为4个步骤:

    初始标记(CMS initial mark)、并发标记(CMS concurrenr mark)、重新标记(CMS remark)、并发清除(CMS concurrent sweep)。

    其中初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会被初始标记阶段稍长,但比并发标记阶段要短。由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

    CMS收集器的优点:并发收集、低停顿,但是CMS还远远达不到完美。

    CMS收集器主要有三个显著缺点

    a>.CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) / 4。

    b>.CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure“,失败后而导致另一次Full GC的产生。由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。这一部分垃圾称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,即需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分内存空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活,也可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提供触发百分比,以降低内存回收次数提高性能。要是CMS运行期间预留的内存无法满足程序其他线程需要,就会出现“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置的过高将会很容易导致“Concurrent Mode Failure”失败,性能反而降低。

    c>.最后一个缺点,CMS是基于“标记-清除”算法实现的收集器,使用“标记-清除”算法收集后,会产生大量碎片。空间碎片太多时,将会给对象分配带来很多麻烦,比如说大对象,内存空间找不到连续的空间来分配不得不提前触发一次Full GC。为了解决这个问题,CMS收集器提供了一个-XX:UseCMSCompactAtFullCollection开关参数,用于在Full GC之后增加一个碎片整理过程,还可通过-XX:CMSFullGCBeforeCompaction参数设置执行多少次不压缩的Full GC之后,跟着来一次碎片整理过程。

    5、G1收集器。相比CMS收集器有不少改进,首先基于标记-整理算法,不会产生内存碎片问题,其次,可以比较精确的控制停顿,此处不再详细介绍。

    6、Serial Old。Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。

    7、Parallel Old。Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

    8、RTSJ垃圾收集器,用于Java实时编程,后续会补充介绍。

    三、Java程序性能优化

    gc()的调用

    调用gc 方法暗示着Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间,调用System.gc() 等效于调用Runtime.getRuntime().gc()。

    finalize()的调用及重写

    gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时)。因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对栈上的对象进行内存回收就要靠finalize()。举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用free()。

    优秀的编程习惯

    (1)避免在循环体中创建对象,即使该对象占用内存空间不大。
    (2)尽量及时使对象符合垃圾回收标准。
    (3)不要采用过深的继承层次。
    (4)访问本地变量优于访问类中的变量。

    本版块会不断更新!

    四、常见问题

    1、内存溢出

    就是你要求分配的java虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
    2、内存泄漏

    是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。




    展开全文
  • JVM参数汇总 链接:[#link]( https://www.cnblogs.com/duanxz/p/3482366.html ) 一、java启动参数共分为三类: 其一是标准参数(-), 所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 其二是非标准参数...
  • 新上线一个java服务,或者是RPC或者是WEB站点, 内存设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析: 依据的原则是根据Java Performance里面的推荐公式来进行设置。     ...
  • JVM(java 虚拟机)内存设置

    千次阅读 2021-02-12 21:26:17
    一、设置JVM内存设置1. 设置JVM内存的参数有四个:-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;-Xmx此设置控制 Java 堆的最大大小。正确调整此参数有助于...
  • JVM内存设置与查看

    千次阅读 2016-01-25 14:07:48
    一、设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-...
  • 如何设置jvm内存

    千次阅读 2021-02-12 14:51:39
    2. 如何分配JVM内存设置:(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效): java -Xmx128m -Xms64m -Xmn32m -Xss16m Test (2)当在集成开发环境下(如eclipse)启动并使用JVM时:a. 在eclipse根目录下打开...
  • 这两天才来公司,遇到很棘手的问题,把公司项目下载下来后无法运行,报错内存溢出问题,然后网上一大堆问题的答案,按照网上的答案解决了tomcat:java.lang.OutOfMemoryError: PermGen space问题,但是后面还有tomcat...
  • kettle JVM内存设置---效果不明显

    万次阅读 2019-06-20 17:39:42
    1、查看本地JVM内存大小 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于...
  • JVM内存配置优化

    2018-12-04 17:28:54
    jvm优化;
  • JVM内存设置与调优指南
  • JVM内存大小应该如何设置
  • jvm优化(二)JVM 内存大小设置

    万次阅读 2017-12-01 19:58:40
    Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。一、Java JVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆...
  • jvm内存分析工具mat

    2019-09-20 23:53:57
    mat用于分析JVM的内存dump信息,是在JVM内存异常时进行内存分析的好工具
  • 新上线一个java服务,或者是Rpc或者是Web站点,内存设置改怎么设置呢?设置多大合适呢? 分析: 依赖的原则是根据Java Performance里面的推荐公式来进行设置。 · 具体来讲: java整个堆大小设置:Xmx和Xms设置为...
  • Tomcat 设置JVM内存大小

    千次阅读 2019-01-02 11:45:11
    1、jvm内存管理机制:    1)堆(Heap)和非堆(Non-heap)内存  按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在...
  • 设置jvm内存

    千次阅读 2017-05-29 13:40:19
    1,打开windows系统环境变量  2,在系统变量中,新建变量JAVA_OPTS,值设置为 -Xms1024M -Xmx2048M -XX:PermSize=256M -XX:MaxNewSize=256M...设置完成后,web容器启动的时候,都会按这个配置初始化Java虚拟机内存
  • JVM系列:解决JVM最大内存设置问题

    千次阅读 2018-08-09 18:36:23
    你知道JVM内存最大能调多大吗,这里和大家分享一下JVM最大内存方面的内容,Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。 JVM内存最大能调多大 ...
  • k8s pod自动重启原因(jvm内存设置

    千次阅读 2020-08-04 14:19:10
    k8s pod自动重启原因(jvm内存设置) k8s集群环境下,docker容器中运行镜像方式启动springboot项目。由于制作的镜像未对JVM的内存进行配置,那么 JVM 会默认设置堆栈的大小,这个大小是根据物理机的内存进行分配的...
  • Websphere7.0环境下修改JVM内存设置 方法1:修改配置的方式 通过修改server.xml进行JVM堆大小的设置: servel.xml文件路径:/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/22Node01Cell/nodes/Node01...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 570,277
精华内容 228,110
关键字:

jvm内存设置

友情链接: Marantz-NA8005_Pre_AMP.zip