Tomcat 配置 jvm GC

  1. tomcat配置jvm GC
    1. 使用javavisualVM,安装visual GC插件,visualvm迁移到github,https://visualvm.github.io/index.html,插件中心里,根据不同jdk版本找到对应插件地址
    2. 在tomcat/bin/catalina.sh 在esac后添加JAVA_OPTS="-Djava.rmi.server.hostname=106.12.147.157 -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    3. cd到 $JAVA_HOME/bin处 VI jstatd.all.policy编写

grant codebase "file:${java.home}/../lib/tools.jar"{

permission java.security.AllPermission;

};目的是给下划线处的文件赋权,不要被java权限控制

  1. 继续添加文件 VI start_jstat.sh编写

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=106.12.147.157 -p3332 -J-Djava.rmi.server.logCalls=true>/dev/null &;注意给该文件赋权后即可启动

  1. GC垃圾回收garbage collection
    1. 目的:程序员在编写程序往往忘记释放内存,造成内存泄漏,即内存被程序一直占据却不再使用,故需要一种办法消除认为错误

垃圾回收越频繁,程序越有问题

  1. 内存泄漏:即分配内存后无法回收,导致系统内存越来越少,最终崩溃
  2. 面向对象,全局、系统层面看,
  3. __del__:析构函数,释放内存;
  4. 内存溢出:out of index,取到另个内存上了
  5. 当没有其他方法引用该对象时,会自动成为garbage,JVM会自动释放该内存块
    1. GC算法(定位的策略):发现无用信息对象;回收内存,大部分使用了根集,有活动对象引用都会引用根集,未引用的可知为无用信息,就像班级点名,点完名后,可知道哪些座位为空,然后进行回收
    2. 代的划分(回收的策略):
      1. 年轻代:新建的对象,该代不足会转移survivor里;从eden和from space或tospace 之间copy,采用copying算法;

年轻代有eden伊甸园、survivor存活区,存活区有from、to空间,其中总有一个存活区为空,空的存活区用于下一次的年轻代GC收集的对象,该对象包括Eden和非空的存活区,都会被复制到空存活区,如此往复,两者角色进行切换

  1. 老年代:多次回收仍然存活的对象;采用mark标记算法进行回收,即扫描存活的对象进行标记,未标记则进行处理,老年回收时间比年轻代长,性能测试会用到

当年轻代存活对象被复制多次,达到一定阈值,就会被提升到老年代,就不是在一个存活区复制到另一个存活区。

老年代一般内存越大,是垃圾概率也越小,GC概率小因为大多都是存活的,采用移动对象来实现最小化内存碎片,即会执行三个步骤:标记GCroot的可达对象;删除不可达对象;整理老年区内容即将存活对象进行复制,依次存放

  1. 元数据(持久代):已加载的类信息,方法信息,常量池等等;不会回收
  1. 执行机制:
    1. 年轻代和老年代串行GC:两者都为单线程垃圾收集器,都会触发全线暂停;通过-XX:+useserialGC;
      • 缺点:不能充分利用多核cpu
    2. 年轻代与老年代的并行GC:扫描复制采用多线程,适用多cpu,对暂停时间较短,是server级别默认方式;通过-XX:+UseParallelGC设置年轻代收集器,通过-XX:UseParalledOldGC设置老年代并行收集器;-XX:+ParallelGCThread=NNN来指定cpu线程数;
      • 缺点:由于GC的所有阶段都不能中断, 所以并行GC很容易出现长时间的停顿. 如果延迟是系统的主要目标, 那么就应该选择其他垃圾收集器组合
    3. 年轻代的并行GC+老年代的cms(concurrent Mark and Sweep打扫):相比于并行GC,调优目标是降低延迟,若服务器为多核cpu,用户会认为系统非常灵敏;通过 -XX:+UseConcMarkSweepGC com.mypackages.MyExecutableClass;
      • 缺点:

最大的问题就是老年代内存碎片问题, 在某些情况下GC会造成不可预测的暂停时间, 特别是堆内存较大情况下

  1. G1:垃圾优先算法,堆不再为连续的年轻代和老年代,划分为小堆区,GC时不用去收集整个的堆空间,每次只处理一部分小堆区即可,通过-XX:+UseG1GC com.mypackages.MyExecutableClass实现;适用于大内存,低延迟场景,终结掉年轻代并行与老年代cms的碎片化问题
    • 缺点:系统若处于吞吐量优先时,或cpu持续占用100%时,CMS更好
    • tomcat开启并查看GC信息 - 小小程序~猿~ - 博客园 (cnblogs.com)
  2. 小结

串行处理器

◆ 适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。

◆ 缺点:只能用于小型应用。

并行处理器:

◆ 适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。

◆ 缺点:垃圾收集过程中应用响应时间可能加长。

并发处理器:

适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

你可能感兴趣的:(tomcat,jvm,java)