精华内容
下载资源
问答
  • tomcat下设置jvm内存参数

    千次阅读 2013-11-30 11:17:12
    tomcat下设置jvm内存参数
    tomcat安装目录下的bin目录(如:f:\Program Files\Apache Software Foundation\Tomcat 6.0\bin)下有一个tomcat6w.exe,双击运行后,设置java选项卡中的三个参数(Initial memory pool、Maximum memory pool和Thread stack size)即可,可以根据服务器内存情况进行修改。
    
    展开全文
  • JDK8 合理设置JVM内存参数

    千次阅读 2019-11-21 12:04:11
    不过,用更少的资源发挥更大的作用是条正道,所以应合理设置JVM内存。 不同java应用对内存要求不同,合适的JVM参数只能通过对每个应用实际运行过程中内存占用数据收集后才能确定。即先设置初值,然后在应用运行过程...

    总述

    基本知识

    JDK8内存模型

    参数

    GC基本要点

    内存数据收集工具

    JVM参数调整过程

    一阶段(设置堆区总内存)

    二阶段(调整New区内存)

    三阶段(调整Eden与Survivor)


    总述

    生产系统稳定性很重要,JVM内存越大,内存溢出的风险越低。只要主机内存允许,多浪费点内存在JVM上也无可厚非。不过,用更少的资源发挥更大的作用是条正道,所以应合理设置JVM内存。

    不同java应用对内存要求不同,合适的JVM参数只能通过对每个应用实际运行过程中内存占用数据收集后才能确定。即先设置初值,然后在应用运行过程中收集内存占用数据,最后计算各内存区域的大小。

    本文主要讲解如何初步确定一个新应用的内存参数,至于更细致的优化方案没做描述。

    基本知识

    JDK8内存模型

    JDK8对内存区域的划分中去掉了之前版本的持久区(PermGen),-XX:PermSize和-XX:MaxPermSize参数失效,也不会发生java.lang.OutOfMemoryError: PermGen异常。取而代之的是元空间(Metaspace),元空间GC与堆区GC独立。

    堆区内存模型:

    JVM默认比例是Eden:S0:S1:Tenured=8:1:1:20。JVM“浪费”掉S1,即40份内存只有39份内存实际储存数据。

    Old:New=2:1,对应参数–XX:NewRatio=2;Eden:S0=8:1,对应参数–XX:SurvivorRatio=8。

    堆区内存回收分为New区的YGC和Old区的FGC。

    参数

    -Xms128M :设置堆内存最小值

    -Xmx128M :设置堆内存最大值

    -XX:NewSize=64M :设置New区最小值

    -XX:MaxNewSize=64 :设置New区最大值

    -XX:NewRatio=2 :设置Old区与New区的比例

    -Xmn64M :设置New区大小,等价于-XX:NewSize=64M 与-XX:MaxNewSize=64M两个参数,此值一旦设置则–XX:NewRatio无效。

    -XX:SurvivorRatio=8 :设置Eden区与两个S区之和的比例

    -verbose:gc :输出每次GC的相关情况

    -Xloggc :../logs/gc.log 日志文件的输出路径

    -XX:+PrintGC :输出GC日志

    -XX:+PrintGCDetails :输出GC的详细日志

    -XX:+PrintGCTimeStamps :输出GC的时间戳(以基准时间的形式)

    -XX:+PrintGCDateStamps :输出GC的时间戳(以日期的形式,如 2019-11-20T21:53:59.234+0800)

    -XX:+PrintHeapAtGC :在进行GC的前后打印出堆的信息

     

    GC基本要点

    新对象在Eden区创建,Eden区空间不足触发YGC。Eden区空间还是不足将对象创建在Old区。

    新对象大小超过-XX:PretenureSizeThreshold参数(默认值是0)大小直接创建在Old区。

    进行YGC时存活的对象在S1(To Space)区中存不下,那么把存活的对象转移到Old区。

    进行YGC时存活的对象gc次数超过-XX:MaxTenuringThreshold(默认值15)的值,那么把存活的对象转移到Old区。

    Old区内存不足时触发FGC,如果空间还不够,则JVM抛出OutOfMemoryError。

    内存数据收集工具

    借助JDK自带命令行jstat -gc pid,显示的大小为KB。

    字段含义为C:总容量,U:已使用容量,S0,S1:survivor区,E:Eden区,O:Old区,M:元空间,CC:CompressedClassSpaceSize,YGC:young区回收次数,YGCT:YGC的总时间,FGC:Old区回收次数,FGCT:FGC的总时间,GTC:YGCT+FGCT。

    如 jstat -gc 11925

    也可使用jmap -heap pid 命令显示堆内存状况。

    JVM参数调整过程

    打印GC日志的参数:-verbose:gc -Xloggc:gc.log -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC

    其中gc.log可设置成实际路径。

    一阶段(设置堆区总内存)

    目标:只设置堆区的总内存,JVM各区使用默认比例

    参数:-Xms128M -Xmx128M

    运行应用程序一段时间后,多次采样数据:

    gstat -gc 11925

    jmap -heap 11925

    可以看到 2次FGC,470次YGC,GC频率还过的去。分析数据后发现两个问题:一、Old区利用率非常低只占用17%,128M内存还是有点浪费;二、Eden区利用率很高,自然的YGC的次数也确实高了点。

    先缩小总内存,基于以上数据计算应用所需总内存=28M+14M,即42M。但To Space会浪费2.5%(1/40)的内存,极限堆区内存=42/(1-2.5%)=44.21M,取个整数用64M应该能满足。即参数:-Xms64M -Xmx64M。64M约是1.5倍的内存。不放心可以用2倍内存89M,取个整数用:-Xms96M -Xmx96M。

    使用极限内存大小可满足应用的基本的运行,不过,可预知的结果是FGC的频率会非常高

    备注:以上的算法将Eden+S0+Old作为堆内存的可用空间,考虑一个极端情况,某次YGC后恰巧把所有Eden区的对象转移到了Old区。所以保险点极限内存应以Old区为基准,则上面的例子中应保证Old区大小不低于42M,极限堆区内存=42/(2/3)=63M。

    二阶段(调整New区内存)

    目标:减少YGC的频率

    参数:-Xms128M -Xmx128M -Xmn64M

    以前面实例,统计数据中应用程序产生的对象占用内存42M,而New区的容量是38M,堆总内存128M,理论闲置80M空间,所以将New区内存超过42M也不为过。

    修改之后,实测jstat -gc 14854,感觉差异不大。

    三阶段(调整Eden与Survivor)

    目标:减少YGC时因Survior空间不足直接转移到Old区

    参数:-Xms128M -Xmx128M -Xmn64M -XX:SurvivorRatio=4

    Eden与Survior是个矛盾,Eden与Survior的比例较大时导致YGC时因S1(To)区空间不足直接把数据转移到Old区;比例较小时S1空间浪费较大。

    常说二八定律,但-XX:SurvivorRatio=8 中的8是Eden区与两个S区之和的比例,不防将Eden与S0区的比例设置成8,也即由8:1:1改成8:2:2,对应-XX:SurvivorRatio=4。推荐值在4到8之间。

     

     

     

     

     

     

     

    展开全文
  • 但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫明的挂掉,想查看下gc日志来排查一下错误的原因,都需要咱们手动设置这些参数。各个参数介绍1.verbose:gc表示,启动jvm的时候,输出jvm里面的gc...

    3ddc89b409a8cae684ac1dda26cba6e6.png

    前言

    大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫明的挂掉,想查看下gc日志来排查一下错误的原因,都需要咱们手动设置这些参数。

    各个参数介绍

    1.verbose:gc

    表示,启动jvm的时候,输出jvm里面的gc信息。格式如下:

    [Full GC 178K->99K(1984K), 0.0253877 secs]

    解读 :Full GC 就表示执行了一次Full GC的操作,178K 和99K 就表示执行GC前内存容量和执行GC后的内存容量。1984K就表示内存总容量。后面那个是执行本次GC所消耗的时间,单位是秒。

    2.-XX:+printGC

    这个打印的GC信息跟上个一样,就不做介绍了。

    3.-XX:+PrintGCDetails

    打印GC的详细信息。格式如下:

    –Heap
    – def new generation   total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
    –  eden space 12288K,  91% used [0x27e80000, 0x28975f20, 0x28a80000)
    –  from space 1536K,   0% used [0x28a80000, 0x28a80000, 0x28c00000)
    –  to   space 1536K,   0% used [0x28c00000, 0x28c00000, 0x28d80000)
    – tenured generation   total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
    –   the space 5120K,   0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
    – compacting perm gen  total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
    –   the space 12288K,   1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
    –    ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
    –    rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

    解读:new generation 就是堆内存里面的新生代。total的意思就是一共的,所以后面跟的就是新生代一共的内存大小。used也就是使用了多少内存大小。0x开头的那三个分别代表的是 底边界,当前边界,高边界。也就是新生代这片内存的起始点,当前使用到的地方和最大的内存地点。

    eden space 这个通常被翻译成伊甸园区,是在新生代里面的,一些创建的对象都会先被放进这里。后面那个12288K就表示伊甸园区一共的内存大小,91% used,很明显,表示已经使用了百分之多少。后面的那个0x跟上一行的解释一样。

    from space 和to space 是幸存者的两个区。也是属于新生代的。他两个区的大小必须是一样的。因为新生代的GC采用的是复制算法,每次只会用到一个幸存区,当一个幸存区满了的时候,把还是活的对象复制到另个幸存区,上个直接清空。这样做就不会产生内存碎片了。

    tenured generation 就表示老年代。

    compacting perm 表示永久代。由于这两个的格式跟前面我介绍的那个几乎一样,我就不必介绍了。

    4.-XX:+PrintGCTimeStamps

    打印GC发生的时间戳。格式如下:

    289

    解读:289.556表示从jvm启动到发生垃圾回收所经历的的时间。GC表示这是新生代GC(Minor GC)。PSYoungGen表示新生代使用的是多线程垃圾回收器Parallel Scavenge。314113K->15937K(300928K)]这个跟上面那个GC格式一样,只不过,这个是表示的是新生代,幸存者区。后面那个是整个堆的大小,GC前和GC后的情况。Times这个显而易见,代表GC的所消耗的时间,用户垃圾回收的时间和系统消耗的时间和最终真实的消耗时间。

    5.-X:loggc:log/gc.log

    这个就表示,指定输出gc.log的文件位置。(我这里写的log/gc.log就表示在当前log的目录里,把GC日志写到叫gc.log的文件里。)

    6.-XX:+PrintHeapAtGC

    表示每次GC后,都打印堆的信息。(这个打印的基本格式跟上面第二条的基本类似,我也就不比多说了。)

    7.-XX:+TraceClassLoading

    监控类的加载。格式如下:

    使用这个参数就能很清楚的看到那些类被加载的情况了。

    8.-XX:+PrintClassHistogram

    跟踪参数。这个按下Ctrl+Break后,就会打印一下信息:

    15num     #instances         #bytes  class name
      
    ----------------------------------------------
      
     1:        890617      470266000  [B
      
     2:        890643       21375432  java.util.HashMap$Node
      
     3:        890608       14249728  java.lang.Long
      
     4:            13        8389712  [Ljava.util.HashMap$Node;
      
     5:          2062         371680  [C
      
     6:           463          41904  java.lang.Class

    –分别显示:序号、实例数量、总大小、类型。

    这里面那个类型,B和C的其实就是byte和char类型。

    9.-Xmx -Xms

    这个就表示设置堆内存的最大值和最小值。这个设置了最大值和最小值后,jvm启动后,并不会直接让堆内存就扩大到指定的最大数值。而是会先开辟指定的最小堆内存,如果经过数次GC后,还不能,满足程序的运行,才会逐渐的扩容堆的大小,但也不是直接扩大到最大内存。

    10.-Xmn

    设置新生代的内存大小。

    11.-XX:NewRatio

    新生代和老年代的比例。比如:1:4,就是新生代占五分之一。

    12.-XX:SurvivorRatio

    设置两个Survivor区和eden区的比例。比如:2:8 ,就是一个Survivor区占十分之一。

    13.-XX:+HeapDumpOnOutMemoryError

    发生OOM时,导出堆的信息到文件。

    14.-XX:+HeapDumpPath

    表示,导出堆信息的文件路径。

    15.-XX:OnOutOfMemoryError

    当系统产生OOM时,执行一个指定的脚本,这个脚本可以是任意功能的。比如生成当前线程的dump文件,或者是发送邮件和重启系统。

    16.-XX:PermSize -XX:MaxPermSize

    设置永久区的内存大小和最大值。永久区内存用光也会导致OOM的发生。

    17.-Xss

    设置栈的大小。栈都是每个线程独有一个,所有一般都是几百k的大小。

    总结
    以上就是我整理的一些jvm设置的参数,当然不止这些。我这只是介绍了些常用的参数。希望能够帮到大家,由于能力有限,如有错误的地方敬请谅解。

    作者:SimpleSmile_5177
    原文链接:jvm的那些设置参数你都知道吗 - SimpleSmile_5177 - 博客园
    展开全文
  • Elasticsearch设置JVM内存参数

    千次阅读 2020-06-17 14:36:42
    在CentOS 7中,该文件位于/etc/elasticsearch/jvm.options中,并使用变量“ -Xms [SIZE] g -Xmx [SIZE] g”设置更多的内存,例如: ..... -Xms4g -Xmx4g ..... | grep -v grep 这将允许Java虚拟机使用4G“总堆空​​...

    Data too large, data for [<http_request>] would be [727300959/693.6mb], which is larger than the limit of [727213670/693.5mb], usages [request=16440/16kb, fielddata=0/0b, in_flight_requests=968/968b, accounting=727283551/693.5mb]

    这里的问题是Java VM已达到最大允许的内存,并且Java虚拟机应允许使用更多的内存。

    找到Elasticsearch的Java VM选项– jvm.options。在CentOS 7中,该文件位于/etc/elasticsearch/jvm.options中,并使用变量“ -Xms [SIZE] g -Xmx [SIZE] g”设置更多的内存,例如:

    .....
    -Xms4g
    -Xmx4g
    .....
    | grep -v grep
    这将允许Java虚拟机使用4G“总堆空​​间的最大大小” 。缺省情况下,它是1G(-Xms1g -Xmx1g)。最好将它设置为服务器内存的一半。照常保存并重新启动Elasticsearch服务:

    # systemctl restart elasticsearch
    您应该在ps命令的命令行中看到该变量:
    # ps axuf|grep elasticsearch
    也可以使用环境变量ES_JAVA_OPTS。

    ES_JAVA_OPTS="-Xms4g -Xmx4g" ./bin/elasticsearch

    展开全文
  • (给ImportNew加星标,提高Java技能)作者:...一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫名的挂掉,想查看下gc日志来排查一...
  • 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的...
  • 前言紧接前2篇文章,我们今天来聊聊升级 Java11 之后的一写 Jvm 参数变化。Java11 删除掉了 cms 垃圾回收器,如果你升级到了 Java11 但是 Jvm 参数仍然使用 cms 垃圾回收器参数时控制台会报错,甚至会启动失败。...
  • 从今天开始进入虚拟机参数部分的学习,通过学习虚拟机参数设置虚拟机参数,配置和跟踪虚拟机,达到故障排查和性能优化的目的。1. 执行 Java 程序的三种方法执行 Java 程序的方法:开发工具执行 Java 代码java -jar...
  • 原文链接:http://blog.csdn.net/yfqnihao 作者:keycoding出自:CSDN 这一节,主要来学习jvm的基本结构,也就是概述。说是概述,内容很多,而且概念量也很大,不过关于...当然,不是说看完本章,就对jvm了解了,jvm...
  • 现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题前几天我们分享了我们java中的基石JVM的相关内存模型(想要精通java,必须要懂Java内存...
  • Tomcat设置JVM内存参数

    2012-01-15 10:38:29
    rem ----- Execute The Requested Command ---------------------------------------   set JAVA_OPTS=%JAVA_OPTS% -server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
  • 在启动jar包的指令前加上以下代码即可 title APP_NAME java -jar app.jar -Xmx4096m -Xms1024m pause
  • 一、JVM内存参数设置 (1)Xss : 含义:设置线程栈大小,默认值为1M; 辅助记忆:ss -> stack size -X:非标准参数。这些参数不是虚拟机规范规定的。因此,不是所有VM的实现(如:HotSpot,JRockit,...
  • JVM内存参数设置

    2018-10-25 14:02:09
    JVM内存参数设置 -Xms1024m 初始内存,指定JVM的最小heap大小。高并发情况下,建议此值设置与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存,也可以防止内存收缩/突然增大带来的性能影响。 ...
  • 概述java内存溢出之后,我们需要根据错误信息分析一下内存溢出的具体原因,及时调整中间件的参数、查看jvm内存分配linux下可以通过jmap -heap 【pid】命令查看jvm的内存分配例如:jmap -heap 1此图可以看出...
  • 设置JVM内存参数有四个:-Xmx Java Heap***值,默认值为物理内存的1/4,***设值应该视物理内存大小及计算机内其他内存开销而定;-Xms Java Heap初始值,Server端JVM***将-Xms和-Xmx设为相同值,开发测试机JVM可以...
  • JVM 内存参数设置

    2015-12-12 15:16:28
    一、本地环境中JVM参数设置:  在本地环境变量中New一个JAVA_OPTS变量名:  variable name: JAVA_OPTS  variable value: -Xms256M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M 二、eclipse中JVM参数...
  • 关于上边这两个问题可以参考下边这两篇文章 JVM内存参数设置 tomcat内存监控
  • jvm内存参数设置

    2016-07-23 14:58:45
    转自:... 一、本地环境中JVM参数设置:  在本地环境变量中New一个JAVA_OPTS变量名:  variable name: JAVA_OPTS  variable value: -Xms256M -Xmx512M -XX:PermS
  • JVM内存参数设置

    2011-04-20 13:23:59
    JVM内存参数设置 (A) PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域 Heap space:存放Instance。 (B)GC...
  • Myeclipse经常会遇到内存溢出和Gc开销过大的情况,这时候就需要修改Myeclipse的Jvm内存参数 修改如下:(使用Extjs做公司大项目时候,不要让项目Builders的Javascript Validator js校验) d:\MyEclipse\MyEclipse ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,696
精华内容 1,478
关键字:

设置jvm内存参数