java虚拟机小记

JVM虚拟机结构:

1.类加载器(ClassLoader:JVM启动时或者在类运行时将需要的class加载到JVM中。

类加载器类型:

BootStrapClassLoader。它是最顶层的类加载器,是由C++编写而成, 已经内嵌到JVM中了。

JVM启动时会初始化该ClassLoader,它主要用来读取Java的核心类库JRE/lib/rt.jar中所有的class文件,这个jar文件中包含了java规范定义的所有接口及实现。

ExtensionClassLoader。它是用来读取Java的一些扩展类库,如读取JRE/lib/ext/*.jar中的包等(这里要注意,有些版本的是没有ext这个目录的)。

AppClassLoader。它是用来读取CLASSPATH下指定的所有jar包或目录的类文件,一般情况下这个就是程序中默认的类加载器。

CustomClassLoader。它是用户自定义编写的,它用来读取指定类文件 。

基于自定义的ClassLoader可用于加载非Classpath中(如从网络上下载的jar或二进制)的jar及目录、还可以在加载前对class文件优一些动作,如解密、编码等。

注意:ExtClassLoader的父类加载器是null,只不过在默认的ClassLoader loadClass 方法中,当parentnull时,是交给BootStrapClassLoader来处理的,而且ExtClassLoader 没有重写默认的loadClass方法,

所以,ExtClassLoader也会调用BootStrapLoader类加载器来加载,这就导致“BootStrapClassLoader具备了ExtClassLoader父类加载器的功能”

类加载器主要方法:

loadClassclassloader加载类的入口,此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从父ClassLoader中寻找,如仍然没找到,则从BootstrapClassLoader中寻找,

最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法,如加载顺序相同,则可通过覆盖findClass来做特殊的处理,例如解密、固定路径寻找等,当通过整个寻找类的过程仍然未获取到Class对象时,

则抛出ClassNotFoundException。如类需要resolve,则调用resolveClass进行链接。

findClass。此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。

defineClass。此方法负责将二进制的字节码转换为Class对象,这个方法对于自定义加载类而言非常重要,如二进制的字节码的格式不符合JVM Class文件的格式,抛出ClassFormatError

如需要生成的类名和二进制字节码中的不同,则抛出NoClassDefFoundError;如需要加载的class是受保护的、采用不同签名的或类名是以java.开头的,则抛出SecurityException

如需加载的class在此ClassLoader中已加载,则抛出LinkageError


2.执行引擎:负责执行class文件中包含的字节码指令(执行引擎的工作机制,这里也不细说了,这里主要介绍JVM结构);


3.内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。运行时内存区主要可以划分为5个区域,如图:

方法区(Method Area):用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。虽然JVM规范把方法区描述为堆的一个逻辑部分,

但它却有个别名non-heap(非堆),所以大家不要搞混淆了。方法区还包含一个运行时常量池。

java(Heap):存储java实例或者对象的地方。这块是GC的主要区域(后面解释)。 从存储的内容我们可以很容易知道,方法区和堆是被所有java线程共享的。

java(Stack)java栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这 个线程创建一个对应的java栈。

在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。

每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是 现成私有的。

程序计数器(PC Register):用于保存当前线程执行的内存地址。由于JVM程序是多线 程执行的(线程轮流切换),

所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。

本地方法栈(Native Method Stack):和java栈的作用差不多,只不过是为JVM使用到native方法服务的。


4.本地方法接口:主要是调用CC++实现的本地方法及返回结果。


JVM GC:

将对象按其生命周期的不同划分成:年轻代(Young Generation)、年老代(Old Generation)、持久代(Permanent Generation)


检测出垃圾

引用计数法

可达性分析算法


年轻代:涉及了复制算法;年老代:涉及了“标记-整理(Mark-Sweep)”的算法。


JVM调优:

从以下几个方面进行:

线程池:解决用户响应时间长的问题

连接池

JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量

程序算法:改进程序逻辑算法提高性能



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值