方法区
2021-09-14 22:31:51 0 举报
方法区
作者其他创作
大纲/内容
栈、堆、方法区的交互
1. 方法的名称 2. 方法的修饰符 3. 方法参数的返回值及类型 4. 方法的返回值类型 5.方法的字节码、操作数栈及局部变量表 6. 异常表。 (每个异常的开始位置、结束位置,代码程序在程序计数器中的偏移地址,被捕获异常的类的常量池索引)
jdk7将StringTable挪到了堆中,因为永久代回收率很低,在full gc的时候才会触发,而full gc 时老年代、永久代不足时才会触发。所以导致StringTable的回收效率很低,而开发中会存在大量的字符串被创建,放到堆里可以保证及时回收
运行时常量池
JIT代码缓存
方法区的垃圾回收主要包含两部分内容:常量池中废弃的常量和不再使用的类型。常量的回收策略是 只要没有被引用的任何地方引用,就属于废弃常量。 判定一个类是否不再被使用,需要满足下面三种类型: 1. 该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。 2. 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如osGi、SP的重加载等,否则通常是很难达成的。 3. 该类对应的java.lang.class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
Heap
静态变量
堆区
intdoublereferenceObjectreturn
演变细节
为什么调整StringTable位置
方法区
到对象数据类型的指针
jdk1.6及以前, 有永久代,静态变量存放在永久上。 jdk1.7 有永久代,逐渐去除\"永久代\",字符串常量池、静态变量逐渐移除,保存在堆中。 jdk1.8及以后,无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串、静态变量仍在堆。
Person person = new Person();
1. 所有域的相关信息及声明顺序 2. 域的完整名称 3. 域的类型 4. 域的修饰符
Java本地变量表
对象数据类型
方法信息
域信息
内 部 结 构
概述
补充
设 置 方 法 区 大 小 及 O O M
栈区
类型信息
百度: 三面:说一下JVM内存模型吧,有哪些区?分别干什么的? 蚂蚁金服: Java8的内存分代改进 JVM内存分哪几个区,每个区的作用是什么? 一面:JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区? 二面: Eden和survior的比例分配 小米: jvm内存分区,为什么要有新生代和老年代 字节跳动: 二面: Java的内存分区 二面:讲讲jvm运行时数据库区什么时候对象会进入老年代? 京东: VM的内存结构,Eden和Survivor比例。 JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。 天猫: 一面:Jvm内存模型以及分区,需要详细到每个区放什么。一面:JVM的内存模型,Java8做了什么修改 拼多多: VM内存分哪几个区,每个区的作用是什么? 美团: java内存分配 jvm的永久代中会发生垃圾回收吗? 一面: jvm内存分区,为什么要有新生代和老年代?
方法区的垃圾回收
方法区也是和Java堆一样,是共享的区域,所有线程都可以共享这一区域。方法区主要是用来存放:类型信息、常量、静态变量和JIT编译后的代码缓存等。同时,当JVM启动的时候,方法区就被创建为固定大小或可动态扩容的区域。方法区在逻辑上属于堆区的一部分,但是一些简单的实现不会进行垃圾收集回收,因此,方法区可以看作是独立与Java堆的一块空间。 在JDK7之前,习惯性的把方法区称为永久代,JDK8之后,废弃了永久代改用本地的元空间代替。元空间和永久代的特征就是:元空间是用的本地实际物理内存,不是虚拟机中分配的内存。
JDK7及以前: -XX:PermSize来设置永久代起始空间大小,默认是20.75M。 -XX:MaxPermSize来设置永久代最大空间大小,32位机器默认32M,64位机器默认是82M。JDK8及以后: 元数据空间可以用参数 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize来指定。 默认值依赖平台,windows下,-XX:MetaspaceSize是21M,-XX:MaxMetaspaceSize=-1则代表没有限制。
方法区一般存储:类型信息、常量、静态变量、JIT代码缓存、域信息、方法信息
运行时常量池是方法区的一部分。 Class文件常量池,主要用于存放编译器生成的各种的字面量和符号引用。这部分内容将类加载后存到方法区的运行时常量池。 运行时常量池和Class常量池最大的区别特征是:具备动态性。
对象实例
1. 类的完整有效名称(类名.包名) 2. 类的修饰符(public、abstract、final的某个子集)3. 类的直接父类的完整有效名称(类名.包名) 4. 类的直接接口的有序列表
0 条评论
回复 删除
下一页