1.虚拟机
操作系统虚拟机,vmware、visual box等;
程序虚拟机,java虚拟机
2.Java虚拟机组成结构
类加载子系统(方法区(类信息)、堆(java实例对象)、直接内存(nio));垃圾回收系统;栈(局部变量、方法参数等)、本地方法栈(系统指令)、寄存器(执行指令);执行引擎(执行字节码)
3.垃圾回收算法
引用计数法(引用循环问题,不使用);
复制算法(适用存活对象少、垃圾对象多);
标记清除算法(产生磁盘碎片);
标记清除压缩算法(标记清除后进行压缩,无磁盘碎片);
分区算法(按区回收,减少系统停顿时间)
4.垃圾回收器种类
串行垃圾收集器(适用单核cpu);
并行垃圾收集器(适合多核cpu);
并发垃圾收集器(多核,效率高于并行垃圾收集器);
G1垃圾收集器;
5.堆、垃圾收集参数配置
新生代:复制算法(eden、from、to);
老年代:标记清除、标记压缩、分区算法
-Xms1024m -Xmx1024m配置堆内存大小;
-Xss指定线程栈大小;
-Xmn设置新生代大小(一般设置为整个堆空间的1/3 1/4),-XX:SurvivorRatio=2(设置eden/from=eden/to),-XX:NewRatio=老年代/新生代;
-XX:PermSize配置永久区(jdk1.7之前,即方法区大小),jdk1.8之后,变更为元数据区,默认只受系统可用内存限制,可以通过-XX:MaxMetaspaceSize
-XX:MaxDirectMemorySize设置直接内存大小,默认为-Xmx大小;
-XX:+PrintGC 打印GC日志;
-XX:+PrintGCDetails打印gc详细日志;
-verbose:class跟踪类的加载和卸载;
-XX:+TraceClassLoading跟踪类的加载,-XX:+TraceClassUnloading跟踪累的卸载;
-XX:+PrintClassHistogram运行时打印查看系统中类的分布情况,按ctrl+break键;
-XX:+PrintVMOptions打印虚拟机接受到的命令行显式参数;
-XX:+PrintCommandLineFlags打印传递给虚拟机的显式和隐式参数;
-XX:+PrintFlagsFinal打印所有的系统参数的值。
-XX:+UseSerialGC在新生代和老年代使用串行收集器;
-XX:PretenureSizeThreshold设置大对象直接进入老年代的阈值;
-XX:MaxTenuringThreshold设置对象进入老年代的年龄最大值。
-XX:+UseParNewGC在新生代使用并行收集器;
-XX:+UseParallelOldGC在老年代使用并行回收器;
-XX:ParallelGCThreads设置用于垃圾回收的线程数;
-XX:MaxGCPauseMillis设置最大垃圾收集停顿时间;
-XX:GCTimeRatio =n系统将花费1/(1+n)的时间用于垃圾回收;
-XX:+UseAdaptiveSizePolicy打开自适应GC策略。
-XX:+UseConcMarkSweepGC新生代使用并行收集器,老年代使用CMS+串行收集器;
-XX:ParallelCMSThreads设定CMS的线程数;
-XX:CMSInitiatingOccupancyFraction设置CMS收集器在老年代空间被使用多少后触发,默认68%;
-XX:+UseCMSCompactAtFullCollection 设置CMS收集器在完成垃圾回收后是否进行一次压缩;
-XX:CMSFullGCsBeforeCompaction设定多少次CMS垃圾回收后进行一次压缩;
-XX:+CMSClassUnloadingEnable允许对元数据区进行垃圾回收;
-XX:CMSInitiatingPermOccupancyFraction当永久去占用率达到这一百分比时启动CMS回收;
-XX:UseCMSInitiatingOccupancyOnly只在达到阈值时进行垃圾回收;
-XX:+UseG1GC;
-XX:MaxGCPauseMillis最大垃圾收集停顿时间;
-XX:GCPauseIntervalMillis设置停顿时间间隔;
-XX:+UseTLab开启TLAB分配;
-XX:+PrintTLAB;
-XX:TLABSize;
-XX:+ResizeTLAB自动调整TLAB大小
-XX:+DisableExplicitGC禁用显示GC;
-XX:+ExplicitGCInvokesConcurrent使用并发方式处理显示GC
6.性能监控命令及工具
jps
jmap -dump
jstat -gc
jstack pid
MAT(memory analyzer)
jconsole
7.类加载过程
加载(1.读取字节码文件;2.存入方法区;3.创建java.lang.Class类实例)、连接(验证(语法、语义等验证)、准备(分配内存空间)、解析(符号引用转换为直接引用))、初始化(赋值)
8.热部署热加载
classloader动态加载类对象
https://www.jianshu.com/p/0f1f5adffdc1