jvm补充知识
jvm是什么
Jdk是软件开发包,包括编译器。Jre是Java代码运行环境,包括Java运行的核心类库和****jvm。Jvm是运行时抽象出的虚拟平台,跨平台工作。类似一个抽象的操作系统,调用各种资源来完成Java代码的运行
Jvm是抽象的操作系统,包括垃圾回收(相当于内存管理),解释器(相当于cpu),字符验证器(类似io),字节码指令集(相当于Linux),不包括Java api 。Jre包括Java api和jvm
Jvm的classloader:

Bootstrap负责loading Java.lang(lang包是Java的核心,包括object,string,class和基本的数据类型)
Extension 负责loading extension class,加载一些Java.util的api
System class负责loading调用其他包的类或同一包中的类
委配模型:要load一个class时,先在method area看是不是已经被load,如果没有被load,将这个class一直传递下去,先给application loader,然后applicationloader将加载请求传递到extension loader,extensionloader再将request传给bootstrap loader,然后bootstrap 先在bootstrap类所在的路径找,如果没有被load,就将class load,否则将在extension loader类路径查找,然后application loader类路径找,如果找不到,throw ClassNotFoundException,相当于一个按顺序的一个轮回

类加载的过程:
1:加载,先找到对应的class文件,然后加载class文件,最后生成一个class对象
2:链接,
验证:验证class文件名(文件格式验证)、元数据验证(验证该class文件和Java的语义是不是一样)、字节码验证(验证字节码文件的格式是不是正确)
准备:为类变量分配内存(类变量在方法区)
解析:将常量池的内容更换为直接引用
3:初始化,初始化类变量,赋初始值,同时执行static修饰的代码块

jvm常见的参数


在gc时,full gc是给老年代回收,minor gc是给年轻代回收垃圾。但给老年代的成本太高了,所以往往尽量让年轻代更大一点
Java 1.8后,没有了永久代,只有元空间,下面指令是指定元空间大小

gc调优
gc调优的目的:尽量在对象进入老年代前回收、执行gc的时间也比较短
策略1:把年轻代的大小调大一点
策略2:对于比较大的对象,直接放在老年代,给年轻代腾点空间呀
策略3:合理设置进入老年代的年龄,可以让年轻代的对象尽可能晚进入老年代
minor gc差不多10s一次,full gc得10分钟一次

jdk的一些命令

jps是看所有的进程状态,jstack是看虚拟机的线程快照
字节码文件
其他语言像Scala等都可以通过编译器转换为class文件,然后去执行
因为class文件的执行面向虚拟机,而不是编译器,所以有很强的跨平台性
