# JVM 方法区详解

1.方法区定义(什么是方法区)

线程共享的运行时内存区域

2.存放数据类型详述

2.1 总述:
1 类信息, 方法描述符(方法参数+返回值),字段信息
2 静态变量(类变量)
3 常量(常量池)
4 编译器编译后的代码
2.2 分述:
  1.1  类信息 

  修饰符(public final)
  类,接口(class,interface)
  类的全限定名(Test/ClassStruct.class)
  直接父类的全限定名(java/lang/Object.class)
  直接父接口的权限定名数组(java/io/Serializable)
  
  1.2  方法描述
  
  修饰符(public static final)
  方法返回值(java/lang/String.class) V
  方法名(getStatic)
  方法参数需要用到的局部变量的大小还有操作数栈大小
  方法体的字节码(就是花括号里的内容)
  异常表(throws Exception)
  
  1.3 字段信息
  
  修饰符(pirvate)
  字段类型(java/lang/String.class)
  字段名(name)
  (ps:不包含字段的值)
  
2.2 静态变量   
demo:  public static String static_str="111";
2.3 常量(final修饰)
demo:
CONSTANT_INGETER_INFO 字节码中的常量池
public final int CONST_INT=0;
CONSTANT_String_info  字节码中的常量池(等待其他类型)   
public final String CONST_STR = "111" ;

静态变量, 常量与静态常量间的区别:

* static 
修饰的属性、方法、代码段跟该类的具体对象无关(所以与this,super不能共存)
初始化在编译期(类加载的时候)

* static final 
修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问

* final 
初始化可以在编译期,也可以在运行期,初始化后不能被改变
final修饰的方法表示该方法在子类中不能被重写
final修饰的类表示该类不能被继承
final修饰的字段不能被修改

3.设置大小(jdk8后方法区由元数据组成)

-XX:MetaspaceSize =21m 默认 可以设置为-1和系统内存同等

4.异常情况

outOfMemoryError 超出内存后抛出的异常

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容