首页 / JAVA / Java jdk调优学习笔记
Java jdk调优学习笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java jdk调优学习笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8382字,纯文字阅读大概需要12分钟。
内容图文
![Java jdk调优学习笔记](/upload/InfoBanner/zyjiaocheng/597/d4657af0b5eb47d99fee3f7d9b161fc5.jpg)
jdk命令行工具监控:
jvm参数类型:
标准参数
-help
-server -client。。。。
X参数
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式,JVM自己决定是否编译成本地代码
XX参数
Boolean类型
格式:-XX[+-]<name>表示其用或者禁用name属性
非Boolean类型
格式:-XX:<name>=<value> 表示name属性的值是value
-Xms是一个XX参数,等价于-XX:InitialHeapSize,其他平时用的也都是XX参数
运行时JVM参数查看
jps查看java进程的pid,jps文档地址:docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html
jinfo使用:
jinfo -flags 需要查看的属性名 pid
jstat查看JVM统计信息
类装载:
垃圾收集:
JIT编译:
jstat -class[-gc.....] pid 每多少秒输出一次 输出多少次
jmap+MAT实战内存溢出
如何导出内存映像文件
内存溢出自动导出
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=.....
使用jmap命令手动导出
jmap -help
MAT使用:
下载:www.eclipse.org/mat/downloads.php
jstack实战死循环与死锁
打印JVM中所有的线程
jstack pid > 文件名称
基于JVisualVM
JVisualVM插件地址:https://visualvm.github.io/pluginscenters.html
远程监控Tomcat
修改Catalina.sh
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -
Dcom.sun.management.jmxremote.port=端口
Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.ssl=false -
Djava.net.preferPv4Stack=true -
Djava.rmi.server.hostname=ip地址"
基于Btrace
可以动态的向目标应用程序的字节码注入追踪代码
JavaComplierApi、JVMTI、Agent、Instrumentation+ASM
安装(github.com/btraceio/btrace):
新加环境变量,修改path(同java配置)
运行方式:
在JVisualVM中添加Btrace插件,添加classpath
使用命令行btrace <pid> <trace_script>
使用详解
拦截方法
普通方法 @OnMethod(clazz="",method="")
构造函数 @OnMethod(clazz="", method="<init>")
拦截重载方法 和普通方法一样 不过是通过参数区分的
拦截时机
Kind.ENTRY:入口,默认值
Kind.RETURN:返回
Kind.THROW:异常
Kind.LINE,line=xx:第几行
拦截this、参数、返回值
this:@Self
参数:可以用AnyType,也可以用真实类型,重载方法用真实类型
返回:@Return
其他/
tomcat性能调优
tomcat远程debug
JDWP(www.ibm.com/developerworks/cn/java/j-lo-jpda3/)
tomcat-manager监控
文档:docs/manager-howto.html
步骤:
1.conf/tomcat-user.xml 添加用户
2.conf/Catalina/localhost/manager.xml配置允许的远程连接
3.重启
psi-probe监控(.com/psi-probe/psi-probe)
步骤和tomcat-manager一样
tomcat调优
内存优化
线程优化
docs/config/http.html
maxConnections:最大连接数
acceptCount:额外线程队列
maxThreads:工作线程
minSpareThreads:最小空闲工作线程
配置优化
docs/config/host.html
autoDeploy:周期性检查是否有新的项目部署,默认为true,建议在server.xml关闭
docs/config/context.html
reloadable:false
JVM层GC调优(docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html)
JVM内存结构
运行时数据区
堆区(young(s区(s0+s1),eden)、old)、非堆区(metaspace、CCS(压缩类空间)、codeCache(通过设置java本地代码模式为-Xint))
-XX:NewSize(新生代) -XX:MaxNewSize
-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:+UseCompressedClassPointers(启用压缩类class指针,对应非堆区的CCS)
-XX:CompressedClassSpaceSize(设置大小)
-XX:InitialCodeCacheSize(codecache大小)
-XX:ReservedCodeCacheSize(最大大小)
垃圾回收算法
思想:枚举根节点,做可达性分析
根节点:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等
标记清除:
先标记需要清除的对象,完成后统一回收
效率不高、会产生碎片
复制:
将内存划分成两块相等的区域,等一块用完将活着的对象复制到另一块区域,清除这块区域
实现简单,空间利用率低
标记整理:
将需要回收的对象标记,不需要回收的都移向另一端,清除其他区域
没有了碎片,整理内存耗时
分带垃圾回收
young区使用复制算法
old用标记清除或者整理
对象分配
对象优先在Eden区分配
大对象直接进入老年代:-XX:PretenureSizeThreshold决定
长期存活对象进入老年代:-XX:MaxTenuringThreshold -XX:+PrintTenuringDistribution -XX:TargetSurvivorRatio
垃圾收集器
串行收集器Serial:Serial、Serial Old
-XX:+UserSerialGC -XX:+UseSerialOldGC
并行(垃圾回收线程并行工作)收集器Parallel:Parallel Scavenge、Parallel Old,吞吐量
吞吐量优先
-XX:+UseParallelGC -XX:+UseParpallelOldGC
Server模式下默认的收集器
并发(垃圾回收线程和程序线程并行)收集器Concurrent:CMS、G1,停顿时间
响应时间优先
CMS:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
G1:-XX:+UseG1GC
停顿时间:垃圾收集器做垃圾回收中断应用执行的时间 -XX:MaxGCPauseMillis
吞吐量:花在垃圾回收与应用程序的时间的比值 -XX:GCTimeRatio=<n>,垃圾收集时间占比:1/1+n
如何让选择垃圾收集器
优先调整堆的大小让服务器自己选择
如果内存小于100M,使用串行收集器
如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
如果允许停顿时间超过1秒,选择并行或者JVM自己选择
如果响应时间最重要,并且不能超过1秒,使用并发收集器
Parallel Collector
-XX:+UseParallelGC手动开启,server模式默认开启
-XX:ParallelGCThreads=<N>多少个GC线程
CPU>8 N=5/8
CPU<8 N=CPU个数
Parallel Collectorc Ergonomics
-XX:MaxGCPauseMillis=<N>
-XX:GCTimeRatio=<N>
-Xmx<N>
动态内存调整
-XX:YoungGenerationSizeIncrement=<Y>
-XX:TenuredGenerationSizeIncrement=<T>
-XX:AdaptiveSizeDecrementScaleFactor=<D>
CMS Collector
并发收集
低停顿 低延迟
老年代收集器
收集过程
缺点
CPU敏感
浮动垃圾
空间碎片
参数
-XX:ConcGCThreads:并发的GC线程数
-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩
-XX:CMSFullGCsBeforeCompaction:多少次FullGc之后做压缩操作
-XX:CMSInitiatingOccupancyFraction:触发FullGC
-XX:+UseCMSInitiatingOccupancyOnly:是否动态调
-XX:+CMSScavengeBeforeRemark:FullGC之前是否先做YoungGC
iCMS
适用于单核或者双核
G1 Collector
Region:G1中内存的单元
STAB:存活对象的快照
RSet:对象之间的关系
常用参数
-XX:+UseG1GC
-XX:G1HeapRegionSize=n,region的大小,1-32M,2048个
-XX:MaxGCpauseMillis=200 最大停顿时间
-XX:G1NewSizePercent、-XX:G1MaxNewSizePercent
-XX:G1ReservePercent=10 保留防止to space溢出
-XX:ParallelGCThreads=n 并行的线程数
-XX:ConcGCThreads=n 并发线 程数=1/4 * 并行
可视化GC日志分析工具
在线工具:http://gceasy.io/
GCViewer:http://github.com/chewiebug/GCViewer
打印日志相关参数
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.logs/gc
-XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution
GC调优步骤
打印GC日志
分析日志
调整相关参数
GC调优参考网站:
CMS:blogs.oracle.com/poonam/understanding-cms-gc-logs
初始设置参数:
生产环境禁用手动GC:-XX:+DisabledEXplicitGC
Parallel GC调优指导
除非确定,否则不要设置最大堆内存
优先设置吞吐量目标
如果吞吐量目标达不到,调大最大内存,不能让OS使用Swap,如果仍然达不到,降低目标
内容总结
以上是互联网集市为您收集整理的Java jdk调优学习笔记全部内容,希望文章能够帮你解决Java jdk调优学习笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。