jvm方法区 笔记5

方法区

交互关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PhlzBkw5-1605517657243)(en-resource://database/5218:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcaxyG9U-1605517657245)(en-resource://database/5220:1)]

方法区的理解

线程共享
内存可以不连续
方法区大小可以设置固定或者扩展
方法区溢出 java.lang.OutOfMemoryError:Metaspace
加载大量第三方jar
tomcat不是工程过多
动态生成反射类

设置方法区大小与oom

-XX:PermSize jdk7 默认20.75M
-XX:MaxPermSize 32位最大64M,64 最大82M

-XX:MetaspaceSize jdk8 21M
-XX:MaxMetaspaceSize 没有限制 -1
默认21m高水位线,触及这个位置,full gc 触发卸载没用的类。重置

方法区的内部结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpuh2ijO-1605517657250)(en-resource://database/5224:1)]

存储内容如下:
存储已被虚拟机加载的类型信息,常量,静态变量,及时编译器编译器变异后的代码缓存

类型信息

  1. 名称 全名(包名.类名)
  2. 直接父类有效名
  3. 类型修饰符
  4. 直接接口有序列表

域信息

保存类型的所有域的相关信息以及域的声明顺序
包括:域名称、域类型、域修饰符

方法信息

名称
返回类型
参数的数量和类型
修饰符
字节码、操作数栈、局部变量表、及大小
异常表

方法区使用

方法区的演进

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hE7rjFrR-1605517657268)(en-resource://database/5222:1)]

元空间本质和永久代类似,元空间不在虚拟机设置的内存中,而是在本地内存

  1. jdk 1.6
    有永久代,静态变量在永久代
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdHsEfpX-1605517657269)(en-resource://database/5226:1)]

  2. jdk1.7
    有永久带,但已经逐步去永久代,字符串常量池,静态变量移除 保存在堆中
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yldNByXi-1605517657271)(en-resource://database/5228:1)]

  3. 1。8
    无永久代。类型信息,字段、方法、常量保存在本地内存的元空间,
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRrrgxDs-1605517657272)(en-resource://database/5230:1)]

永久代为什么被元空间替换
  1. 永久代设置空间大小是很难确定的
  2. 永久代调优困难
    1. 常量池中废弃的常量和不再使用的常量

运行时常量池 和 产量池

方法区 内部包含运行时常量池
字节码文件,内不包含常量池
一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含常量池表(constant pool table)包括各种字面量和对类型域和方法的符号引用

常量池

数量值
字符串值
类引用
字段引用
方法引用

运行时常量池

子加载类和接口到虚拟机后,就会创建对应的运行时常量池

垃圾回收

如何解决oom

  1. 通过内存映像分析工具,对demp出来的堆转储快照进行分析,判断是内存泄露,memory leak,还是memory overflow
  2. 内存泄露的话,进一步通过工具查看泄露对象dao

内存泄露

通过工具查看泄露对象到GC roots的引用链,如果不是内存泄露,应当检查虚拟机的堆参数(-Xmx与-Xms),从代码上检查是否存在某些对象生命周期过长,持有状态时间过长

non-final

静态变量和类关联在一起,随着类的加载而加载,他们成为类数据在逻辑上的一部分
类变量被类的所有实例共享,及时没有类实例你也可以访问

全局常量 static final

被声明为final 的类变量得处理方法不同,每个全局常量在编译的时候就会被分配了

StringTable

jdk7 将stringtable 放到了堆空间中,因为永久代回收效率很低,

静态变量

静态引用对应的对象实体始终在堆空间,

方法区垃圾收集两个部分

常量池中废弃的常量和不再使用的类型,

  1. 只要常量池中的常量没有人被任何地方引用,就可以被回收

  2. 判定一个类型是否属于 不在使用的类 条件就计较苛刻了

    1. 该类所有实例都被回收,java堆中不存在该类和派生子类的实例
    2. 加载该类的类加载器已经被回收
    3. 该类对应的java.lang.class 对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

    -Xnoclassgc 是否类型进行垃圾回收
    -verbose:class
    -XX:+TraceClass-Loading 查看类加载
    -XX:+TraceClassUnLoading 写在信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值