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

 

fromtoGC之后有交换谁空谁是to

 

** 引用类型传内存地址

     基本数据类型传复印件

 

Young  1/3                                                                                     Old  2/3

=================================================================

|Eden (8/10)|Survivor From(1/10)|Survivor To(1/10)|                              |

=================================================================

         复制->清空->交换

                   第一次GCEden区幸存的对象复制到Survivor From中,接着对Eden区进行清空,存活的对象年龄加一。第二次GC,扫描Eden区和Survivor From区,如果有幸存的对象直接放入Survivor to区,然后to区和from区进行互换,并且幸存的对象年龄加一。15GC之后还存活的对象直接放入Old区。

 

元空间(Perm)逻辑上属于heap,但是实际上他是方法区的一个实现,元空间存储的是jdk自身携带的ClassInterface的元数据。

        

 

栈+堆+方法区的交互关系

 

                                              JVM各组件的功能

 

方法区中是模板,heap中是实例对象,栈中是对象的引用。

相关文章:

  • 2021-04-20
  • 2021-12-12
  • 2022-01-23
  • 2021-09-14
  • 2021-11-28
  • 2021-11-26
  • 2022-12-23
  • 2021-12-13
猜你喜欢
  • 2021-10-08
  • 2021-04-24
  • 2021-07-22
  • 2021-09-05
  • 2021-06-09
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案