ClassLoader(类加载器)
什么是类加载器?
加载和初始化.class文件
类加载器有几种?
3种分别是:启动类加载器(BootStrap)
扩展类加载器(Extension)
应用程序加载器(AppClassLoader)
什么是双亲委派?
AppClassLoader要加载class文件不会立即加载,他会把类加载请求委派给父类加载器ExtClassLoader去完成。
ExtClassLoader要加载class文件也不会立即加载,他会把类加载请求委派给父类加载器BootStrapClassLoader去完成。
如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),他会使用ExtClassLoader进行尝试加载。
如果ExtClassLoader也加载失败,会使用AppClassLoader进行加载,如果AppClassLoader也加载失败,将会跑出异常ClassNotFoundException。
什么是沙箱安全?
防止随意代码污染java主代码
Native
放在native方法栈中(不归java管理,用于调用其他语言服务)
PC寄存器
存储下一条指令的地址,也是当前线程执行的字节码的行号指示器。
方法区
1.所有线程共享
2.会有垃圾回收
什么是方法区?
a.各线程共享的运行时内存区域,存储了类的结构信息。
b.方法区就是一个规范、模板。
例如:
方法区 f = new 元空间()
方法区 f = new 永久代()
相当于:List list=new ArrayList()
等号左边是引用(reference),等号右边是实例对象
*注* 静态方法属于全员方法独一份,实例变量是自带的变量
实例变量存在堆中,和方法区无关
*************栈管运行,堆管存储************
*java栈(stack)
栈内存不存在垃圾回收
生命周期和线程一致
stack存在哪些东西?
8种基本数据类型的变量+对象的引用+实例方法都是在函数栈内存中分配。
*注*经典数据结构:
队列:(FIFO)先进先出
栈:先进后出
*注* 8种数据类型:
1.整数型byte(8位),short(16位),int(32位),long(64位)
2.浮点型:double(64位),float(32位)
3.布尔型:Boolean(1位)
4.字符型:char(16位)
java方法 = 栈帧
*注*引用类型(reference)全部在栈里面
Person p1=new Person()
1.Person p1就是reference在栈中
2.new Person()是实例在堆中
3.Person类中结构信息在方法区中
栈溢出:StackOverflowError
*heap堆
堆的逻辑结构
============================================
新生代new
伊甸园(Eden Space)
幸存者0区(Survivor 0 Space)
幸存者1区(Survivor 1 Space)
老年代old
元空间
============================================
例子:
new Person();
new在了新生代的Eden Space
进一步流入到Survivor 0 Space
然后流入 Survivor 1 Space
最后流入 old
Eden Space full à YGC(轻GC)
Old Space full à FGC
Full GC多次之后发现养老区没有空间能腾出,报错OOM
from和to:GC之后有交换谁空谁是to
*注* 引用类型传内存地址
基本数据类型传复印件
Young 1/3 Old 2/3
=================================================================
|Eden (8/10)|Survivor From(1/10)|Survivor To(1/10)| |
=================================================================
复制->清空->交换
第一次GC,Eden区幸存的对象复制到Survivor From中,接着对Eden区进行清空,存活的对象年龄加一。第二次GC,扫描Eden区和Survivor From区,如果有幸存的对象直接放入Survivor to区,然后to区和from区进行互换,并且幸存的对象年龄加一。15次GC之后还存活的对象直接放入Old区。
元空间(Perm)逻辑上属于heap,但是实际上他是方法区的一个实现,元空间存储的是jdk自身携带的Class,Interface的元数据。
栈+堆+方法区的交互关系
方法区中是模板,heap中是实例对象,栈中是对象的引用。