jvm-方法区

来源:互联网 发布:淘宝手机助手苹果版 编辑:程序博客网 时间:2024/05/22 09:42

jvm方法区(Method Area)

当jvm使用类装载器装在某个类时,它首先要定位到对应的class文件,然后读入这个class文件,最后提取该文件的内容信息,并将这些信息存储到方法去,最后返回一个class实例。

方法区是系统分配的一个内存逻辑区域,是一块所有线程共享的内存区域,用来存储类型信息(类型信息可以理解为类的描述信息(类的全限定名,访问修饰符,字段,方法等)),方法区的大小决定了系统可以包含多少个类,如果系统类太多,方法区内存不够会导致方法区溢出,虚拟机同样会抛出内存溢出信息。方法去特点:

1.方法区是线程安全的,由于所有的线程都共享方法区,所以方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入jvm,那么只允许一个线程去装在它,而其他线程必须等待。

2.方法去的大小不必是固定的,jvm可根据应用需要动态调整,同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是jvm自己的堆)中自由分配。

3.方法区也可被垃圾收集,当某个类不在被使用时,jvm将卸载这个类,进行垃圾收集。

方法区存放内容:

1.类的全限定名(类的全路径名)。

2.类的直接超类的权全限定名(如果这个类是Object,则它没有超类)。

3.类的类型(类或接口)。

4.类的访问修饰符,public,abstract,final等。

5.类的直接接口全限定名的有序列表。

6.常量池(字段,方法信息,静态变量,类型引用(class))等

类变量:

类变量为静态变量,在方法去中有个静态去,静态去专门用来存放静态变量以及静态块。

方法区内存大小设置:

jdk1.6,jdk1.7 永久区

-XX:PermSize=10M 初始化方法区大小为10M。

-XX:MaxPermSize 方法区最大内存为10M。

-XX:PrintGCDetails 打印日志详情。

jdk1.8 元数据区

-XX:MetaspaceSize=10M

-XX:MaxMetaspaceSize=10M

元数据区发生溢出,虚拟机一样抛出异常,如下:

java.lang.OutOfMemoryError Metaspace


原创粉丝点击