JVM-类的加载机制(从磁盘加载class文件到内存中,解析并执行class文件、产生对象)
Native 通过加载本地方法调用JNI接口调用;主要用来拓展JAVA的使用
类的加载依赖加载器来完成加载
- BootStrap加载器>extends加载器>启动类加载器(非继承关系)
- BootStrap:只加载java文件下lib的核心库、只负责加载java、javax、sun开头的包中的类
- extends:只加载jre文件夹下ext文件下的包
- System加载器:加载ClassPath路径下的java文件、通常是用户自己定义的类
- 类的加载原则:缓存原则、双亲委派原则、全盘原则
- 缓存原则:每加载一个类就会缓存该类的信息、当需要再次使用的时候、会直接判断这个类是否已经被加载;
- 双亲委派原则:当接收到类的加载任务、会先将这个类委托给上级加载器加载,一直往上查找,如果上级不能加载的时候,则会返回,由自己加载;
- 全盘原则:一个类如果被一个加载器加载了,那么这个类中出现的其它类也会被这个加载器直接加载。
- JVM内部运行结构
- 由类加载器将class文件从硬盘加载到内存中、
- 在运行过程中产生的数据、分为线程共享区和线程私有区、
- 线程共有区 主要是堆和方法区、方法去里面存储的是class结构信息、堆里面存储的运行过程中产生的对象;
- 线程私有区:主要是有程序计数器、线程栈、本地方法栈等
- 线程会在每次调用方法的时候产生栈帧(栈帧里面有局部变量、动态链接等操作)
- 执行引擎用来负责执行整个程序、从方法里面取出字节码文件来进行执行、从而产生对象、
- 执行引擎里还包括了gc、gc主要在堆和方法去进行垃圾回收
-
JVM调优-JConsole和Java VisualVM
减少GC的频率和Full GC的次数 -
GC垃圾回收算法:复制算法、标记清除、标记压缩
- 复制算法:优点没有内存碎片;但是浪费内存空间,有一半是TO 用来交换复制
- 标记清除:会出现2次扫描浪费时间、存在内存碎片、但是节省了内存空间(第一次扫描标记被引用对象、第二次进行清除)
- 标记压缩:防止内存碎片,再次扫描