故障检测、性能调优与Java类加载机制讲解

举报
SHQ5785 发表于 2023/07/31 09:23:15 2023/07/31
【摘要】 一、故障检测、性能调优 1.1 用什么工具可以查出内存泄露MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗;EclipseMAT:是一款开源的java内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP,可以下载RCP的独立版本或者Eclipse的插件版本;JProbe:分析java的...

一、故障检测、性能调优

1.1 用什么工具可以查出内存泄露

  • MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗;
  • EclipseMAT:是一款开源的java内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP,可以下载RCP的独立版本或者Eclipse的插件版本;
  • JProbe:分析java的内存泄漏;

二、类加载机制

2.1 JVM 类加载过程

JVM加载类的过程,双亲委派模型中有哪些方法?有没有可能父类加载器和子类加载器加载同一个类?如果加载同一个类,该使用那哪一个类?

JVM如何加载一个类的过程

  1. 加载:查找和导入class文件;
  2. 连接
  • 检查:检查载入的class文件数据正确性;
  • 准备:为类的静态变量分配存储空间;
  • 解析:将符号引用转换成直接引用(可选)
  1. 初始化:初始化静态变量,静态代码块。
  2. 使用
  3. 卸载

双亲委派图
这里写图片描述
双亲委派概念:

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一层次的加载器都是如此。因此所有的类加载请求都会传给顶层的启动类加载器,只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。

加载器分类如下:

  • 启动类加载器:是用本地代码实现的类装入器,它负责将/lib下面的类库加载加载到内存中{比如:rt.jar}。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作.
  • 扩展类加载器
  • 应用程序类加载器

双亲委派模型中有哪些方法有没有可能父类加载器和子类加载器加载同一个类?
父类和子类不可能同时加载一个类。一个类的加载先由它的父类进行加载,若父类(递归向上)加载不了,则由子类加载。
加载的过程如下:

  1. 通过findLoadedClass(),查看请求的类是否被加载过;
  2. 若没有加载,则调用父类加载器的loadClass()方法进行加载;
  3. 若父类加载器加载为空,则用启动类加载器作为父类加载器;
  4. 如果父类加载失败,则抛出异常;
  5. 然后再调用自己的findClass()方法进行加载;
  6. 最后判断该类是否进行解析resolveClass()

其中用到的方法有:

  1. loadClass()
  2. findLoadedClass()
  3. findbootstrapClassOrNull()
  4. findClass()
  5. resolveClass()

2.2 Student s=new Student();在内存中做了哪些事情?

  1. 加载Student class文件进内存;
  2. 在栈内存为s开辟空间;
  3. 在堆内存为学生对象开辟空间;
  4. 对学生对象的成员变量进行默认初始化;
  5. 对学生对象的成员变量进行显示初始化;
  6. 通过构造方法对学生的成员变量赋值;
  7. 生对象初始化完毕,把对象地址赋值给s变量;

这里写图片描述
这里写图片描述

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。