9159金沙游艺场

图片 1
Java面试笔试-001-Java语言的优点

批处理文件_添加打印机

JVM命令行参数解析9159金沙游艺场:

Source作为公司内部代码托管工具,用户通过git的push、pull、clone等操作以及在web端查看代码进行代码对比的操作都将在短时间内产生大量的对象,并且这些对象的存活时间也不会很长。

1. java命令行参数

  • 先看java命令行的参数

    solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java
    Usage: java [-options] class [args...]
           (to execute a class)
       or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
    where options include:
    -d32      use a 32-bit data model if available
    -d64      use a 64-bit data model if available
    -server   to select the "server" VM
    -zero     to select the "zero" VM
    -dcevm    to select the "dcevm" VM
                  The default VM is server,
                  because you are running on a server-class machine.
    
    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
    See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
    solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java -version
    openjdk version "1.8.0_141"
    OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-1~deb9u1-b15)
    OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)
    solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$
  • 看一个实际运行的java命令:

    solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ ps aux | grep java
    solr         1  0.2 13.3 3060500 272904 ?      Ssl  Oct08  44:03 /docker-java-home/jre/bin/java -server -Xms512m -Xmx512m -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 -XX:+CMSScavengeBeforeRemark -XX:PretenureSizeThreshold=64m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=50 -XX:CMSMaxAbortablePrecleanTime=6000 -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:-OmitStackTraceInFastThrow -verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/opt/solr/server/logs/solr_gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=9 -XX:GCLogFileSize=20M -Dsolr.log.dir=/opt/solr/server/logs -Djetty.port=8983 -DSTOP.PORT=7983 -DSTOP.KEY=solrrocks -Duser.timezone=UTC -Djetty.home=/opt/solr/server -Dsolr.solr.home=/opt/solr/server/solr -Dsolr.install.dir=/opt/solr -Dsun.net.inetaddr.ttl=60 -Dsun.net.inetaddr.negative.ttl=60 -Xss256k -jar start.jar --module=http
    
  • -Xms512m -Xmx512m

    • 用于设置java堆的最小值和最大值,将最大-Xmx和最小-Xms设置为一样可以避免堆自动扩展。
    • 参考:JVM调优总结 -Xms -Xmx -Xmn
      -Xss等
    • 参考:成为Java
      GC专家(5)—Java性能调优原则
  • -XX:NewRatio=3
    • 用来来指定新生代和整个堆的大小比例,或者直接用–XX:NewSize来指定所需的新生代空间。如果设置了NewRatio,那么整个堆空间的1/(NewRatio
      +1)就是新生代空间的大小。
    • 使用CMS垃圾回收时,需要设置一个充足的新生代空间。然而,当新生代空间的大小超过一个特定的水平,程序的响应能力会被降低。
  • -XX:SurvivorRatio=4
    • Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个新生代的1/6。
    • 参考:JVM系列三:JVM参数设置、分析
  • -XX:TargetSurvivorRatio=90
    • 参考:JVM -XX:
      参数介绍
    • 参考:MaxTenuringThreshold 和
      TargetSurvivorRatio参数说明
    • 设定survivor区的目标使用率。默认50,即survivor区对象目标使用率为50%,最高90%。
    • 设置survivor区的目标使用率,当使用率达到时重新调整TenuringThreshold值,让对象尽早的去old区。
  • -XX:MaxTenuringThreshold=8
    • 设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4。每经过一次YGC,年龄加1,当survivor区的对象年龄达到TenuringThreshold时,表示该对象是长存活对象,就会直接晋升到老年代。
    • 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代.
      对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。该参数只有在串行GC时才有效.
  • -XX:+UseConcMarkSweepGC
    • 使用CMS内存收集算法
    • 启用CMS低停顿垃圾收集器,减少FGC的暂停时间
  • -XX:+UseParNewGC
    • 设置新生代为并行收集。可与CMS收集同时使用JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
  • -XX:ConcGCThreads=4
    • 参考:JVM实用参数(七)CMS收集器
    • 标志-XX:ConcGCThreads=(早期JVM版本也叫-XX:ParallelCMSThreads)定义并发CMS过程运行时的线程数。
  • -XX:ParallelGCThreads=4
    • 并行收集器的线程数。
    • 此值最好配置与处理器数目相等,同样适用于CMS
  • -XX:+CMSScavengeBeforeRemark
    • 参考:JVM GC算法 CMS
      详解(转)
    • 在CMS GC前启动一次ygc,目的在于减少old gen对ygc
      gen的引用,降低remark时的开销—–一般CMS的GC耗时
      80%都在remark阶段
    • 开启-XX:+CMSScavengeBeforeRemark选项,强制remark之前开始一次minor
      gc,减少remark的暂停时间,但是在remark之后也将立即开始又一次minor
      gc。
  • -XX:PretenureSizeThreshold=64m
    • 对象超过多大是直接在旧生代分配
    • 单位字节 新生代采用Parallel Scavenge
      GC时无效另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.
  • -XX:+UseCMSInitiatingOccupancyOnly
    • 命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期,禁止hostspot自行触发CMS
      GC。
    • 只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。
  • -XX:CMSInitiatingOccupancyFraction=50
    • 设定CMS在对内存占用率达到50%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);
    • 这两个设置一般配合使用,一般用于『降低CMS
      GC频率或者增加频率、减少GC时长』的需求;
    • -XX:CMSInitiatingOccupancyFraction=70
      是指设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);
    • -XX:+UseCMSInitiatingOccupancyOnly
      只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.
  • -XX:CMSMaxAbortablePrecleanTime=6000
    • 参考:Tenured
      区并发垃圾回收器CMS介绍
  • -XX:+CMSParallelRemarkEnabled
  • 降低标记停顿
  • -XX:+ParallelRefProcEnabled
  • 参考:一步步优化JVM五:优化延迟或者响应时间(3)
  • 这个选项可以用HotSpot
    VM的任何一种垃圾回收器上,他会是用多个的引用处理线程,而不是单个线程。这个选项不会启用多线程运行方法的finalizer。他会使用很多线程去发现需要排队通知的finalizable对象。
  • -XX:-OmitStackTraceInFastThrow
  • 参考:强制要求JVM始终抛出含堆栈的异常
  • 参考:java中的exception
    stack有时候不输出的原因
  • -verbose:gc
  • 表示输出虚拟机中GC的详细情况.
  • 参考:JVM启动参数之
    -verbose:gc
  • 参考:jvm参数-verbose:gc和-XX:+PrintGC有区别?
  • -XX:+PrintHeapAtGC
  • 打印GC前后的详细堆栈信息
  • -XX:+PrintGCDetails
  • 需要在生产环境或者压测环境中测量这些参数下系统的表现,这时候需要打开GC日志查看具体的信息,因此加上参数:-verbose:gc
    -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
    -Xloggc:/home/test/logs/gc.log

  • -XX:+PrintGCDateStamps

  • -XX:+PrintGCTimeStamps
  • -XX:+PrintTenuringDistribution
  • 查看每次minor GC后新的存活周期的阈值
  • -XX:+PrintGCApplicationStoppedTime
  • 打印垃圾回收期间程序暂停的时间.可与上面混合使用
  • -Xloggc:/opt/solr/server/logs/solr_gc.log
  • 把相关日志信息记录到文件以便分析.与上面几个配合使用
  • -XX:+UseGCLogFileRotation
  • 启用GC日志文件的自动转储
  • -XX:NumberOfGCLogFiles=9
  • GC日志文件的循环数目
  • -XX:GCLogFileSize=20M
  • 控制GC日志文件的大小
  • 参考:-xx:+usegclogfilerotation
    • Built-in support for GC log rotation has been added to the
      HotSpot JVM. It is described in the RFE 6941923 and is available
      in: Java 6 Update 34 Java 7 Update 2 (but there is no reference
      to it in these release notes)。
    • There are three new JVM flags that can be used to enable and
      configure it:
    • -XX:+UseGCLogFileRotation
      must be used with -Xloggc:;
      -XX:NumberOfGCLogFiles=
      must be >=1, default is one;
      -XX:GCLogFileSize=M (or K)
      default will be set to 512K.
  • -Xss256k
  • 每个线程的堆栈大小
  • JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行
    调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
  • ### 1.2 javap反编译工具

  • 将class文件反编译为字节码

  • 使用-XX:+PrintAssembly参数来输出反汇编

    ### 1.3 java命令行参数使用

  • -XX:+PrintGCDetails,在发生垃圾收集行为的时候打印内存回收日志。

一、    常用参数

调优之前jvm使用的垃圾回收策略是新生代老年代均使用parallel
Scanvenge,也就是默认策略,堆大小为2G。出现的问题是:

  -Xms 

  JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存;开发测试机JVM可以保留默认值。(例如:-Xms4g)

  1. 永久代初始内存64M设置过小,运行过程中永久代内存可达到90M
  2. Minor gc频繁,说明eden区内存不足
  3. Minor gc时间过长,平均一次需要80ms
  4. 垃圾收集的并行线程数43个,服务器是8核,线程数偏多
  5. Full gc频繁,平均是半个小时一次,一次full gc耗时800ms左右

  -Xmx 

  JVM可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列。最佳设值应该视物理内存大小及计算机内其他内存开销而定。(例如:-Xmx4g)

参数设置:-XX:+PrintGCDetails-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:ParallelGCThreads=20-Xmn900m-XX:SurvivorRatio=1-XX:PermSize=128m-Xmx2048m-Xms2048m第一次调优新生代收集器改用parnew,parnew收集器不会动态的去调整新生代大小去达到吞吐率要求,但更容易控制。垃圾收集线程数改为20,减少线程之间的切换开销,提升minor
gc速度,设置survivor:eden=1:1,永久代初始大小设置为128m,老年代收集器默认是单线程的serial
old。同时禁止代码显式GC。得到的结果是full频率下降很多,这里的原因在于survivor区增大,因为survivor区内存不足而直接进入老年代的情况减少,minor
gc频率有所提高,minor
gc耗费的平均时间变为此前的一半,频率更高的原因可能在于eden区300m大小偏小,而耗费时间的减少一方面是eden区较小,另一方面则是垃圾收集线程的切换开销减小了。

  -Xmn 

  Java Heap
Young区大小。整个堆大小=年轻代大小 + 年老代大小 +
持久代大小(相对于HotSpot
类型的虚拟机来说)。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。(例如:-Xmn2g)

  程序新创建的对象都是从年轻代分配内存,年轻代由Eden
Space和两块相同大小的SurvivorSpace(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定年轻代的大小,也可以通过-XX:SurvivorRation来调整Eden
Space及SurvivorSpace的大小

  9159金沙游艺场 1

  老年代用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

参数设置:-XX:+PrintGCDetails-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:ParallelGCThreads=20-Xmn900m-XX:SurvivorRatio=2-XX:PermSize=128m-XX:MaxTenuringThreshold=10-Xmx2048m-Xms2048m第二次调优修改eden区大小为450m,力图降低minor
gc频率,同时设置经过多少次minor
gc过后,存活的对象进入老年代,默认值15,调整过后full
gc的频率有所提高,minor
gc频率仍然偏高,说明eden区还是太小,此外过小的survivor区大小也影响了full
gc的频率。

  -Xss 

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

参数设置:-XX:+PrintGCDetails-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:ParallelGCThreads=8-Xmn1000m-XX:SurvivorRatio=2-XX:PermSize=128m-XX:MaxTenuringThreshold=10-Xmx2048m-Xms2048m第三次增大年轻代大小到1000m,减少gc时的并发线程数至CPU核数相同,结果是minor
gc频率降低,并且每次minor gc时间骤降到16ms左右,十个小时内进行过一次full
gc,耗时接近1s。继续观察出现的问题,由于短暂的出现大量的大对象,造成短时间内大量的minor
gc并且由此引发了数次full gc,判断是否是一次“良好”的minor
gc可以从本次gc时新生代大小判断,如果大小接近最大值说明引发gc的对象不大,如果当前新生代大小很小,说明出现了大对象,并且该对象很有可能将会由于survivor不够大而进入老年代。结合三次调优可以发现source
jvm的内存空间还不太够。

  -XX:PermSize

  持久代(方法区)的初始内存大小。(例如:-XX:PermSize=64m)

参数设置:-XX:+PrintGCDateStamps-XX:TargetSurvivorRatio=100-XX:+PrintTenuringDistribution
//minor
gc后打印分代信息-XX:+UseConcMarkSweepGC-XX:+CMSParallelRemarkEnabled
//启用CMS并发标记-XX:+UseCMSCompactAtFullCollection
//启用碎片整理-XX:CMSFullGCsBeforeCompaction=0 //设置多少次FULL
GC过后执行一次碎片整理-XX:+UseCMSInitiatingOccupancyOnly
//启用CMS占比阈值-XX:CMSInitiatingOccupancyFraction=80
//设置阈值百分比,内存超过该百分比将执行CMS
GC-XX:SurvivorRatio=2-XX:+PrintGCDetails-XX:+UseParNewGC-XX:ParallelGCThreads=8-Xmn1500m-XX:+DisableExplicitGC-XX:PermSize=128m-XX:MaxTenuringThreshold=10-Xmx4096m-Xms4096m这一次调优是经过了几个参数调整的最终成型结果,有如下一些比较重要的改变

  -XX:MaxPermSize

  持久代(方法区)的最大内存大小。(例如:-XX:MaxPermSize=512m)

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图