浅学JVM

JVM大致结果: 

 

浅学JVM_第1张图片

一.类加载器

1.类加载器收到类加载的请求之后

2.找到当前加载器(AppClassLoader)的父加载器(ExtClassLoader)的父加载器(null,找不到这个加载器因为Java底层用c和c++写的),直到根加载器

3.看是否能找到需要加载的类,如果能找到,加载这个类,找不到就用找子加载器找,直到最底层的加载器找不到或找到需要加载的类

二.native

1.Java底层是用C和C++语言编写的,Java底层要去调用C和C++的库使用native关键字

2.会进入本地方法栈中去调用本地方法接口

三.方法区

静态变量,常量,类信息等存放在方法区中

四.栈

栈:先进后出,后进先出

主线程结束,栈就over,栈不存在垃圾回收问题

存放内容:8大类型+方法+对象引用

五.堆

一个JVM只有一个堆

堆内存满了:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

1.新生区

伊甸园区:所有的对象都是从这new出来的

幸存区(0,1)

2.老年区:从幸存区活下来的对象

3.永久区(元空间):存放Java的运行时的一些环境

4.OOM,内存溢出

默认情况:JVM分配的内存是电脑的1/4,初始化内存是电脑的1/64

当JVM的内存满时内存溢出,解决办法把JVM的内存调大看是否满,

命令(JVM总内存和初始化内存为1024MB):-Xms1024m -Xmx1024m -XX:+PrintGCDetails

浅学JVM_第2张图片

 内存溢出:浅学JVM_第3张图片

 可以使用JProfiler工具进行分析

六.GC

        GC的作用区域:方法区,堆

GC分类:轻GC,重GC

堆:伊甸园区,from区,to区,养老区,元空间

注:from和to区可以交换的谁是空的谁是to区

复制算法:在新生区的from区和to区,当GC垃圾回收时,伊甸园区的幸存对象到,to区,那么使用复制算法将from区的内容复制到to区,此时的to区变为from区

标记清除压缩算法:第一次扫描,对对象进行标记;第二次扫描,对没有标记的对象进行清除;第三次扫描,把存活的对象放在一端,为了防止内存碎片化

你可能感兴趣的:(学习笔记,java,开发语言)