java虚拟机 jvmjava
jvm是jre的一部分算法
当数据被放入JVM的时候,数据会被分解到不一样的位置多线程
java运行时内存划分并发
线程共享区:jvm
堆区和方法区性能
线程私有区:优化
虚拟机栈、本地方法栈和程序计数器spa
堆区放真实对象线程
虚拟机栈放java方法3d
本地方法栈放 native方法
方法区放 类的信息、常量、静态变量
程序计数器 线程执行到第几行
堆中分
新生、老年、永久代
新生区分为 eden s0 s1 8:1:1
常见的垃圾回收器
Serial收集器:单线程 它只会使用一个 CPU 或一条收集线程去完成收集工做,而且在进行垃圾回收时必须暂停其它全部的工做线程直到收集结束。
parNew收集器:多线程 能够认为是serial的多线程版本
CMS收集器: 是一种以获取最短回收停顿时间为目标的收集器 基于标记清除算法实现
G1收集器: 面向服务端的垃圾回收器,是Oracle JDK 9之后的默认GC选项
优势:并行与并发、分代收集、空间整合、可预测停顿
垃圾回收算法:
复制算法
标记-清除算法
标记整理-算法
JVM调优
类的生命周期:
加载 链接(验证 准备 解析) 初始化 使用 卸载
加载:将.class文件从磁盘读取到内存
验证:验证字节码的正确性
准备:给类的静态变量分配内存并赋予默认值
解析:装载器装入类所引用的其余全部类
类加载器的种类
启动类加载器
负责加载JRE的核心类库,如JRE目标下的rt.jar,charsets.jar等。
扩展类加载器
负责加载jre扩展目录ext中的jar
系统类加载器
负责加载classpath路径下的类包
用户自定义加载器
负责加载用户自定义路径下的类包
类加载器的关系:向上委托的关系
全盘负责委托机制
当一个ClassLoader加载一个类的时候,除非显示的使用另外一个ClassLoader,该类所依赖和引用的类也由这个ClassLoader载入。
双亲委派机制(模型)
指先委托父加载器寻找目标类,在找不到的状况下在本身的路径中查找并载入目标类
JVM性能调优监控命令
垃圾回收对堆空间作回收,栈空间内存随着线程的消亡而消亡,并不受jvm垃圾回收的管辖!
jps:经过jps查询进程的id pid
jinfo:查看正在运行的java程序的扩展参数
查看JVM的参数
jinfo -flags 11740
.调优
JVM调优主要就是调整下面两个指标
停顿时间:垃圾收集器作垃圾回收中断应用执行的时间。-XX:MaxGCPauseMillis
吞吐量:垃圾收集的时间和总时间的占比:1/(1+n),吞吐量为1-1/(1+n)。-XX:GCTimeRatio=n
GC调优步骤
1.打印GC日志
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:c:/log/gc.log
Tomcat能够直接加载JAVA_OPTS变量
2.分析日志获得关键性指标
3.分析GC缘由,优化JVM参数
Parallel Scavenge收集器(默认)
分析日志:
第一次调优,设置Metaspace大小:增大元空间大小 ()-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
第二次调优,增大年轻代动态扩容增量(默认是20%),能够减小YGC: -XX:YoungGenerationSizeIncrement=30
合并调优
-XX:+PrintGCDetails -XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -XX:YoungGenerationSizeIncrement=30 -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:c:/log/gc-2.log
使用G1收集器收集日志
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseG1GC -Xloggc:./log/gc-g1.log