1:JVM内存模型
1 jdk 1.8 里主要是 分成了 堆(新生代【eden,s0,s1】,老年代,元空间),方法区,程序计数器,虚拟机栈,本地方法栈
2 对象和共享变量放到堆里,类信息,方法和字符串常量池放到方法区里,栈里面都是内存地址值和局部变量
3 本地方法栈——私有,存储线程的本地方法调用信息,也是主要是栈帧。是c 语言实现
4 程序计数器——私有,记录线程的当前执行的位置信息。
2:jvm 垃圾回收分析和优化
1. 回收发生在哪里?主要是 堆和方法区中的对象和废弃常量和无用的类
2. 对象在什么时候可以被回收?引用计数和可达性分析算法
3. 如何回收?GC 算法 标记清楚,标记整理,复制算法,分代收集 具体看下图
4. jmap -heap pid 查看jvm 参数配置和使用情况
5. jvm 性能几个指标
吞吐量:系统总运行时间 = 应用程序耗时 +GC 耗时。如果系统运行了 100 分钟,GC 耗时 1 分钟,则系统吞吐量为 99%。
停顿时间:指垃圾收集器正在运行时,应用程序的暂停时间。对于串行回收器而言,停顿时间可能会比较长;并行时间停顿时间短但是吞吐量低
垃圾回收频率:通常垃圾回收的频率越低越好,增大堆内存空间可以有效降低垃圾回收发生的频率
6. 查看 & 分析 GC 日志
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs //这里是以时间(日期形式)形式打出详细的GC的日志 输出到日志文件
日志分析工具 https://sourceforge.net/projects/gcview