《深入理解Java虚拟机:JVM高级特性与最佳实践》学习笔记 Ⅱ
第4章 虚拟机性能监控与故障处理工具
//学习了虚拟机内存分配与回收技术的理论,还要掌握如何在实际工作中应用。
//介绍了随JDK发布的6个命令行工具和2个可视化的故障处理工具。
1.JDK的命令行工具
JDK的bin目录下有许多工具,可以用于监视虚拟机和故障处理。
很多小工具的命名都类似Unix命令,比如jps,功能和Linux的ps相似。
常用的JDK命令行工具:
jps:
jstat:虚拟机统计信息监视工具
jinfo:
jmap:
jhat:
jstack:
2.JDK的可视化工具
JConsole:Java监视与管理控制台
VisualIVM:多合一故障处理工具
第5章 调优案例分析与实战
//分享几个比较有代表性的实际案例。
1.高性能硬件上的程序部署策略
在高性能硬件上部署程序,主要有两种方式:
通过64位JDK来使用大内存;
使用若干个32位虚拟机建立;逻辑集群来利用硬件资源。
对于用户交互性强,对停顿时间敏感的系统,给虚拟机分配超大堆的前提是有把握把应用程序的Full GC频率控制得足够低,不能影响用户使用。
控制Full GC频率的关键是看应用中绝大多数对象能否符合"朝生夕灭"的原则,即大多数对象的生存时间不应当太长,尤其是不能产生成批量的、长生存时间的大对象,这样才能保障老年代空间的稳定。
在使用64位JDK管理内存时,还需要考虑下面可能面临的问题:
内存回收导致的长时间停顿;
性能可能普遍较低;
因为指针膨胀及数据类型对齐补白等因素,相同的程序在64位JDK中消耗的内存一般比32位JDK大。
2.集群间同步导致的内存溢出
3.堆外内存导致的溢出错误
//大量使用NIO操作会占用很多堆外内存。
下面是一些实践经验,除了Java堆和永久代之外的内存:
Direct Memory:可通过-XX:MaxDirectMemorySize 调整大小,内存不足时抛出OutOfMemoryError
或者OutOfMemoryError:Direct buffer memory。
线程堆栈:可通过-Xss调整大小,内存不足时抛出StackOverflowError(纵向无法分配,即无法分配新的栈帧)
Socket缓存区:每个Socket连接都Receive和Send两个缓存区,分别占大约37KB和25KB的内存。
JNI代码:
虚拟机和GC:
4.外部命令导致系统缓慢
5.服务器JVM进程崩溃
6.实战:Eclipse运行速度调优
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。