JVM内存结构、垃圾回收机制、类加载器、类加载过程概述

1、JVM内存结构

        JDK1.8之前:方法区、本地方法栈、虚拟机栈、堆、程序计数器。

        JDK1.8之后:元空间、本地方法栈、虚拟机栈、堆、程序计数器。

        方法区:用于存放已经被加载的类的信息,包括静态变量、编译后的代码、常量等信息,是线程共享的区域。

        堆:存放的是新创建的对象,是线程共享的区域。

        虚拟机栈:每个Java方法执行的时候都会创建一个栈帧用来存放变量、操作数、常量池等信息,一个Java方法从调用到执行完就对应了一个栈帧在虚拟机中从入栈到出栈的整个过程。是线程私有的。

        本地方法栈:与虚拟机栈类似,但是它里面的方法不是普通的Java方法,而是native方法。是线程私有的。

        程序计数器:用来记录当前线程执行的位置,当发生上下文切换的时候,线程切换回来时就可以通过程序计数器知道上次线程执行到什么位置了。是线程私有的。

        元空间:与方法区类似,但是它使用的是本地内存,它不在虚拟机中。

2、垃圾回收机制

        标记-清除算法:分为了“标记”和“清除”阶段,首先标记出所有不需要回收的对象,然后将没有被标记的对象统一回收掉。这种算法会有空间问题,标记清除后,系统里面会产生大量不连续的内存空间。

        复制算法:将内存分为了两部分,一个是from区、一个是to区,每次只使用其中一块区域。比如对from区进行垃圾回收的时候,先将from区的存活对象移动到to区里面,然后再一次性清理掉from区中的对象。而当要对to区的对象进行回收的时候,同样也是要先将存活对象移动到from区,然后再一次性清理掉to区中的对象。

        标记-整理算法:跟标记-清除算法类似,但是它在标记-清除算法的基础上,会对存活对象进行整理。能避免产生大量不连续内存空间的问题。

        分代收集算法:当前虚拟机使用的都是分代收集算法,即新生代用复制算法,老年代用标记-清除算法和标记-整理算法(新生代垃圾回收15次会变成老年代)。因为新生代每次进行垃圾回收都会有大量对象死亡,只有少量存活,所以使用复制算法,每次只需要复制少量的存活对象,效率比较高。

3、类加载器

        启动类加载器(BootstrapClassLoader):用于加载lib目录下的类。

        扩展类加载器(ExtensionClassLoader):用于加载lib/ext目录下的类。

        应用程序类加载器(AppClassLoader):用于加载用户自己编写的类。

        双亲委派机制:在类加载的时候,系统会先判断当前类有没有被加载过,已经被加载过的类会直接返回,否则才会尝试加载。加载的时候会将请求委派给上一级的类加载器进行加载,如果上一级的类加载器无法进行加载,就会继续向更上一级进行委派。即先通过应用程序类加载器进行加载,不能加载就指派给扩展类加载器进行加载,再不能加载就指派给启动类加载器进行加载。

        如果要实现自定义的类加载器,则通过继承ClassLoader实现。

4、类的加载过程

        类的加载过程分为加载、连接、初始化,连接又分成了验证、准备、解析。

        加载:通过类的全限定名获取到类的字节码文件;将字节流的静态结构转换为方法区的动态结构;在内存区域生成类Class对象;

        验证:进行文件的格式、元数据、字节码、符号引用的验证,确保加载的类符合JVM执行的规范;

        准备:为类变量分配内存,并设置值,类变量就是static变量,这也是为什么static可以直接调用的原因;

        解析:将常量池里的符号引用替换为直接引用;

        初始化:执行类构造器进行初始化。

5、JVM调优(如何快速定位线上OOM)

        OOM(Out Of Memory 内存溢出,程序申请内存的时候,没有足够的内存空间供其使用,即程序申请的内存超过了系统能给予的,系统不能满足要求,产生溢出)

        可能导致OOM的原因:

        1、一次性申请的对象过多。可以通过更改申请对象的数量解决。

        2、或者内存资源耗尽,对象未释放,即内存泄漏(程序申请内存之后,无法释放已占用的那部分内存空间,即一部分对象被引用着,没法进行垃圾回收)。可以通过找到未释放的对象进行释放解决。

        3、分配的堆内存资源不够,无法支撑应用的日常操作。可以通过jmap -heap命令查看堆信息解决。

        处理OOM的方法也分为两种情况:

        1、系统已经OOM挂了:可以提前设置JVM参数  -XX+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

        2、系统运行中,还未OOM:导出dump文件,jmap -dump:format=b,file=xx.hprof 14660

        然后这两种情况分别结合JavaVisualVM这个软件进行调优:查看最多与业务有关的对象,找到GCRoot,并查看线程池

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值