jvm简单了解

java虚拟机 jvm

jvmjre的一部分

当数据被放入JVM的时候,数据会被分解到不同的位置

java运行时内存划分

线程共享区:

堆区和方法区

线程私有区:

虚拟机栈、本地方法栈和程序计数器

堆区放真实对象

虚拟机栈放java方法

本地方法栈放 native方法

方法区 类的信息、常量、静态变量

程序计数器  线程执行到第几行

 

堆中分

新生、老年、永久代

新生区分为 eden  s0  s1   811

常见的垃圾回收器

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

猜你喜欢

转载自www.cnblogs.com/lkc123/p/11461483.html