Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 431|回复: 0

JRebel热加载插件激活、启动报错解决方法以及java类加载、热加载原理

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-4 15:52:50 | 显示全部楼层 |阅读模式

    idea安装好热加载插件 JRebel,启动后报错java.lang.OutOfMemoryError: PermGen space解决方法
    报错原因是因为内存溢出了,也就是内存不足,方法就是增加内存,添加如下配置:

    参数解释:
    -Xms,表示程序启动时,JVM 堆的初始化最小尺寸参数;
    -Xmx,表示程序启动时,JVM 堆的初始化最大尺寸参数;
    -XX:PermSize,表示程序启动时,JVM 方法区的初始化最小尺寸参数;
    -XX:MaxPermSize,表示程序启动时,JVM 方法区的初始化最大尺寸参数。


    激活JRebel
    生成 GUID 的网址:https://www.guidgen.com/

    用这个网址 + 生成的 GUID 激活

    https://jrebel.qekang.com/
    

    例如:

    https://jrebel.qekang.com/cb2546bb-9d43-4115-bf4b-10539349efed
    

    设置离线模式 来防止失效

    File -> Settings -> JRebel -> [Work offline]按钮
    

    既然用了这个热加载,就了解一下这个热加载原理

    一、java类加载

    java的类加载过程
    一个java类文件到虚拟机里的对象,要经过如下过程:

    首先我们编写好了的java源代码通过java编译器,将java源代码文件编译成class字节码,类加载器读取class字节码,再将类转化为实例,对实例newInstance就可以生成对象。
    类加载器ClassLoader功能,也就是将class字节码转换为类的实例。在java应用中,所有的实例都是由类加载器,加载而来。一般在系统中,类的加载都是由系统自带的类加载器完成,而且对于同一个全限定名的java类(如com.csiar.soc.HelloWorld),只能被加载一次,而且无法被卸载。


    加载class字节码的工作是由类加载器实例去实现的,类加载器支持通过文件目录,jar,zip,网络等多种途径,加载class字节码文件。
    JVM启动后就默认有三个类加载器实例,负责去加载不同位置的class。
    1.核心类库加载器 BootStrap ClassLoader,负责加载jdk安装目录下lib文件夹里面的jar包,我们的String.class,System.class这些类都放在这个目录下面,启动jvm就会去加载,必不可少。
    2.拓展类库加载器 Extension ClassLoader,负责加载jdk安装目录下lib/ext文件夹里面的jar包,这里面是一些jdk的拓展jar包,比如zipfs.jar这样的包或工具类。拓展的意思就是在某些情况下,这些jar包不加载也不影响jvm工作。
    3.应用程序代码加载器 Application ClassLoader,负责加载我们自己写的程序代码,通过java命令 -cp 或者 -classpath告诉jvm我们的代码class存放位置。如果我们的程序是jar包运行,你可以在jar包 META-INF目录MANIFEST.MF文件里面看到一个Class-Path: .配置,这就是指定代码位置的。


    java类加载的阶段

    加载阶段
    找到类的静态存储结构,并加载到虚拟机里面,然后转换成方法区的运行时数据结构,生成class对象,加载阶段,用户可以自定义类加载器参与进来。
    验证阶段
    主要确保字节码安全的,确保不会对虚拟机安全造成危害,可以通过JVM启动参数来禁用一些验证,但不推荐修改设置,参数禁用可能会对虚拟机安全造成一些危害。
    准备阶段
    确定内存布局,初始化内存变量,注意点:赋初始值,不会执行程序自己定义的赋值操作,比如定义了一个私有变量:private static int count = 12,在准备阶段并不是把count初始为了12,这里是会赋初始值,int初始值为0,所以会把这私有静态变量赋值为0,而不是12。
    解析阶段
    这个阶段主要是将符号引用变为直接引用。
    初始化阶段
    调用程序自定义的代码。比如private static int count = 12, count在本阶段将会被初始化为12,而不是之前准备阶段的0,初始化阶段会生成clean int 方法,这个方法由编译器自动收集类中的所有类变量的赋值、动作和静态语句块中的语句合并,同一个类加载器中,只会将一个类型初始化一次。

    Java虚拟机没有强制约束什么时候开始初始化阶段,但规定了5种情况必须立即初始化,当然这之前的几种操作都是已经运行了的。5种情况如下:

    1.遇到new、 get static 、post static、 invoke static这四条字节码指令的时候,如果类没有初始化,需要触发初始化,注意的是final修饰的类,会在编译期的时候,将结果放在常量池,即使调用也不会触发初始化,因为final修饰的是常量,会把常量放在常量池,调用常量不会触发初始化这个阶段。
    2.使用java.long.reflect包里方法,即对类进行反射调用的时候,如果类没初始化的话,需要初始化。
    3.当初始化一个子类的时候,如果父类还没有初始化,需要先初始化父类,再初始化子类。
    4.虚拟机启动的时候,用户制定一个要执行的主类,虚拟机会先初始化这个主类,例子:我们写的java程序,在某一个类里面写了一个main方法,通过运行这个main方法启动这个程序,虚拟机会先初始化这个main方法所在的类。
    5.使用jdk1.7动态语言支持的时候,如果java.lang.invoke.methondhandler类实例解析的最后结果是ref_getstatic、ref_putstatic、ref_invokestatic方法句柄的时候,如果句柄对应的类没有初始化,那就需要先初始化句柄对应的类。

    二、Java类加载器的特点

    1.由AppClass Loader(系统类加载器)开始加载指定的类;
    2.类加载器将加载任务交给其父类,如果其父类找不到,再交给自己去加载(即双亲委派);
    3.Bootstrap Loader (启动类加载器)是最顶级的类加载器。

    三、热加载原理

     热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一个后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变化了,则将类重新载入。
    对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为; 热加载则是在运行时通过重新加载改变类信息,直接改变程序行为。

    四、参考博文

    (1) https://www.cnblogs.com/cdcr/p/9737166.html (热加载插件启动时报内存溢出解决方法)
    (2) https://blog.csdn.net/wing_93/article/details/78561736 (热部署原理解析以及热部署实现)
    (3) https://blog.csdn.net/u013159507/article/details/82960847 (类加载过程)
    注意:如果要点击链接,需要复制链接地址不要复制括号内的文字,直接点击无法打开。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-7 08:19 , Processed in 0.062938 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表