一、简述
本文较为粗浅的梳理总结JVM的内存管理及执行子系统,以思维导图的形式来展现要点知识,再结合对一些关键点的详细阐述及自身开发过程的应用场景分析,从而更为系统化的学习和研究JVM。
PS:由于一些内容较多,文章内容会逐步补充
二、思维导图
![](https://img-blog.csdnimg.cn/img_convert/c6c694cb68ee2d3c42c5d2679e48f618.png)
了解内存结构对理解Java程序运行时的内存分配就会有更好的认识,每块的功能区域会有不同的大小,发生内存不足会有相应的错误提示;Java堆区域的内存分配是运行时动态产生的数据分配所在的空间,对象的生命周期主要依据分代理论,因此原先经典的内存回收算法也是以此为基础进行分区域的回收管理,回收策略上有清楚、复制、整理不同的方式,因此产生了不同的垃圾收集器组合;性能监控工具主要是对多线程、类对象、内存使用等的监控分析 ,从而定位问题解决问题。
![](https://img-blog.csdnimg.cn/img_convert/00a5ebda52fd513bc02fcd9b283a2d8b.png)
代码文件编译为字节码文件是Java程序变成通用可执行文件的基础,理解类文件结构和字节码指令对深入理解Java程序特性起到重要作用(PS: 当然不研究底层特性,研究这个帮助不大) ;类加载机制对于了解类对象的生命周期及一些容器服务有一定的帮助;字节码解析执行过程中相应的有一些工具可以进行动态代理和扩展,使得Java程序获得一定的动态性,同时对于一些从底层出发改写服务或监控工具提供了支持。
三、知识要点
1、提示内存不足的错误类型
OutOfMemeryError
StackOverflowError
2、常量池的理解
3、CMS收集器
4、G1收集器
5、JVM参数
内存大小参数
-Xms : 初始堆
-Xmx: 最大堆
-XX:NewSize=n 新生代大小
-XX:MaxPermSize=n 持久代大小
收集器设置
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParalledOldGC
-XX:+UseConcMarkSweepGC
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器
-XX:ParallelGCThreads=n
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
并发收集器设置
-XX:+CMSIncrementalMode:
-XX:ParallelGCThreads=n
6、命令行及参数
7、加载器的双亲委派
四、应用场景
对idea的内存调优
调优后减少了Eden的gc次数
![](https://img-blog.csdnimg.cn/img_convert/1886c0923181d6989482cc80f259a927.png)
![](https://img-blog.csdnimg.cn/img_convert/cae7f0efb9108c6292a3bcb92f53b001.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/dcb12de72dfefd011faff2db61e6bc73.png)
五、 参考资料
1、《深入理解Java虚拟机》第三版 , 周志明 著