jvm补充知识

2020-07-23  本文已影响0人  bangbang2

jvm是什么

Jdk是软件开发包,包括编译器。Jre是Java代码运行环境,包括Java运行的核心类库和****jvm。Jvm是运行时抽象出的虚拟平台,跨平台工作。类似一个抽象的操作系统,调用各种资源来完成Java代码的运行

Jvm是抽象的操作系统,包括垃圾回收(相当于内存管理),解释器(相当于cpu),字符验证器(类似io),字节码指令集(相当于Linux),不包括Java api 。Jre包括Java api和jvm

Jvm的classloader:

image.png

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,相当于一个按顺序的一个轮回

image.png

类加载的过程:

1:加载,先找到对应的class文件,然后加载class文件,最后生成一个class对象

2:链接,

验证:验证class文件名(文件格式验证)、元数据验证(验证该class文件和Java的语义是不是一样)、字节码验证(验证字节码文件的格式是不是正确)

准备:为类变量分配内存(类变量在方法区)

解析:将常量池的内容更换为直接引用

3:初始化,初始化类变量,赋初始值,同时执行static修饰的代码块

image.png

jvm常见的参数

image.png image.png

在gc时,full gc是给老年代回收,minor gc是给年轻代回收垃圾。但给老年代的成本太高了,所以往往尽量让年轻代更大一点

Java 1.8后,没有了永久代,只有元空间,下面指令是指定元空间大小

image.png

gc调优

gc调优的目的:尽量在对象进入老年代前回收、执行gc的时间也比较短

策略1:把年轻代的大小调大一点

策略2:对于比较大的对象,直接放在老年代,给年轻代腾点空间呀

策略3:合理设置进入老年代的年龄,可以让年轻代的对象尽可能晚进入老年代

minor gc差不多10s一次,full gc得10分钟一次

image.png

jdk的一些命令

image.png

jps是看所有的进程状态,jstack是看虚拟机的线程快照

字节码文件

其他语言像Scala等都可以通过编译器转换为class文件,然后去执行

因为class文件的执行面向虚拟机,而不是编译器,所以有很强的跨平台性

image.png
上一篇 下一篇

猜你喜欢

热点阅读