前段时间又看了一遍《深入理解Java虚拟机》,感觉比以前看的理解程度多了一些。找一些以前的关于虚拟机参数的笔记内容写下来。
虚拟机有很多种,一般应用的都是HotSpot虚拟机,所以大家讨论的也都是针对这款虚拟机。不同的虚拟机实现是不一样的。
运行时会根据热点程序,进行不同程度的优化编译,不是编译一次就完事的。高级编译时会引入大胆的优化策略,也会留逃生门。
一,注意事项
- 虚拟机在64位机器上,内存大于32G时,会放弃指针压缩,导致内存很大浪费,所以内存最好控制在4-32G。
- 使用Jinfo观察运行时的所有参数;
- jstack查看线程信息;jmap生成dump文件;jstat观察运行时的类加载、编译、回收内容。
- 使用MAT可视化分析线上Dump文件。由于文件一般比较大,所以分析时比较耗内存,也比较慢。
- 出现内存溢出的问题时,仔细看一下报错内容,在不同区域内存报错的类型或提示是不一样的。
二,垃圾收集器
- 目前HotSpot使用的是分代收集法。相关策略有Serial、ParNew、Parallel、CMS、G1等等。
- NewRatio参数设置新生代和老生代的内存比例。
- 新生代Eden和Survivor的默认比例是8:1,即SurvivorRatio为1。
- Windows和Linux(CPU只有一个核)时,JVM默认运行的模式是Client,此时默认的收集器是Serial;在Linux多核时默认运行的模式是Server,收集器使用的是Parallel。
- 可通过-XX:Use***GC来修改收集器类型,