JVM初探

1 JVM的位置

类加载器的类别
BootstrapClassLoader(启动/根类加载器)
c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作

ExtClassLoader (标准扩展类加载器)
java编写,加载扩展库,如classpath中的jre ,javax.*或者
java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。

AppClassLoader(系统类加载器)
java编写,加载程序所在的目录,如user.dir所在的位置的class

CustomClassLoader(用户自定义类加载器)
java编写,用户自定义的类加载器,可加载指定路径的class文件

4 双亲委派机制:

当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,则抛出异常,通知子类加载器去加载这个类

双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

5 Native关键字

如果出现native关键字,则说明Java的作用范围达不到了,需要调用底层由C语言写的本地方法库
调用流程
1 先进入本地方法栈
2 通过本地方法接口(JNI)来调用本地方法库

JNI的作用
为了融合其它的语言被Java调用
历史
在Java诞生之初,C,C++横行,为了融合C ,C++ 专门开辟了一个内存空间(本地方法栈),来记录本地方法,在最后加载时通过JNI来加载本地方法库

6 栈

特点: 先入后出
主管程序的运行,生命周期与线程同步,线程结束,栈空间就释放,所以栈不可能有GC
运行原理:栈帧,就是一个方法在栈空间所占的空间
存储内容: 八大基本类型,对象的引用,实例的方法

初始化时:

1、类加载器ClassLoader,加载Student.class字节码到内存;

2、在栈里面为变量s申请一个空间,用来声明s;

3、new的时候,在堆内开辟空间。然后,开始进行默认初始化,String类型默认给null,int类型默认给0等。默认初始化后,开始进行显示初始化,比如成员变量里name默认值为Alice,所以这时会初始化name为Alice。

3、执行Student()构造方法,构造方法进栈,进行构造方法初始化

4、执行构造方法初始化,构造方法执行完毕后出栈,把堆内的对象物理地址,复制给栈内的s,也就是s存放的是对象的引用(物理地址)。

5、执行Student里面的方法时,方法进栈,方法里隐式的this指向堆内存空间

7 堆

8 GC

JVM在进行GC时,并不是进行对三个区域都进行GC,而是大多数GC都在新生区

8.1 GC题目

1 JVM的内存模型和分区,详细到每一个分区应该放什么
2 堆里面的分区有哪些Eden(伊甸园区)from(幸存0区) to(幸存1区) 养老区 ,说说各自的特点br> 3 GC的算法有哪些 标记清除法 标记压缩法 引用计数法 复制算法,怎么用br> 4 轻GC 和 重GC 什么时候发生/p>

8.2 GC算法

1 引用计数法

优点:节省空间
缺点:两次扫描,严重浪费时间,会产生内存碎片

4 标记压缩算法

YGC的触发条件:
1 Eden区剩余空间放不下新的对象
2

FGC的触发条件
1 Old区剩余空间放不下新的对象

2 系统调用System.gc 可能调用

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91338 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月26日
下一篇 2020年7月26日

相关推荐