一、Java类执行的流程:
3、类加载器
1.BootstrapClassLoader
纯C++实现的类加载器,没有对应的Java类,主要加载的是jre/lib/目录下的核心库
2.ExtClassLoader
类的全名是sun.misc.Launcher$ExtClassLoader,主要加载的是jre/lib/ext/目录下的扩展包
3.AppClassLoader
类的全名是sun.misc.Launcher$AppClassLoader,主要加载的是CLASSPATH路径下的包
那么这样由什么好处呢?
采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
类加载图
OOM错误( OutOfMemoryError )
- -Xms8m 设置初始化内存分配大小/164
- -Xmx8m 设置最大分配内存,默认1/4
- -XX:+HeapDumpOnOutOfMemoryError 在文件中生成 .hprof文件
- -XX:+PrintGCDetails 在控制台打印输出
GC垃圾回收
jvm在进行GC
- 新生代
- 幸存区(里面有两个 :form,to)
- 老年区()
GC两种回收机制:轻GC(普通)、重GC(全局GC)
GC题目:
- JVM的内存模型和分区~详细到每个区放什么?
- 堆里面的分区有哪些? Eden, form, to, 老年区,说说他们的特点?
-
- 轻GC(普通)、重GC(全局GC)分别在什么时候发生什么时候?
GC的算法有哪些?标记清除法,标记整理,复制算法,引用计数器法
1、标记清除法
2、复制算法
Xmx:最大堆内存,如:-Xmx512m
-Xms:初始时堆内存,如:-Xms256m
-XX:MaxNewSize:最大年轻区内存
-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
-XX:MaxPermSize:最大持久带内存
-XX:PermSize:初始时持久带内存
-XX:+PrintGCDetails。打印 GC 信息
-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3
-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10