方法区
隐0士
这个作者很懒,什么都没留下…
展开
-
jvm对象创建与实例化
创建对象的方式有以下六种:直接new、调用Xx的静态方法、使用XxxBuilder/XFactory的静态方法Class的newinstance0 :反射的方式,只能调用空参的构造器,权限必须是public(已经被废弃)Constructor的newinstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求使用cloneo:不调用任何构造器,当前类需要实现Cloneable接口,实现clone0使用反序列化:从文件中、从网络中获取一个对象的二进制流第三方库Objenes原创 2021-11-08 17:17:49 · 118 阅读 · 0 评论 -
jvm方法区的垃圾回收
一般来说方法区的回收很难令人满意,因为条件苛刻所以回收效果不太好,但又是需要的。方法区主要回收的是两个东西:类型信息和运行时常量池。运行时常量池字面量和符号引用,字面量主要包括三类:类和接口的全限定名字段的名称和描述符方法的名称和描述符只要常量池的常量没有被引用,就可以回收。类型信息判断一个类型不再被使用的条件比较苛刻,需要满足以下三个条件:该类的所有实例都被回收了加载该类的类加载器已经被回收,除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则是很难达成的原创 2021-11-08 16:52:32 · 248 阅读 · 0 评论 -
jvm方法区的演进细节
只有hotspot才有永久代,,在hotspot中方法区的变化如下:jdk6时有永久代,静态变量放在永久代中jdk7时,有永久代,但逐渐被放弃,字符串常量池、静态变量从永久代移除,保存到堆中。jdk8及以后,就没有永久代了,类型信息,字段,方法,常量保存在本地内存中的元空间里,但字符串常量以及静态变量仍然放在堆中。永久代为什么会被元空间替代?1、官网的说法是JRockit没有永久代,在hotspot合并后,就不提供这样的参数配置了。2、为永久代设置空间大小是很难确定的,如果在某些场景下动态原创 2021-11-08 16:49:38 · 149 阅读 · 0 评论 -
jvm运行时常量池和常量池
概述常量池是字节码信息中的一部分,在类的字节码文件中我们能看到常量池信息常量信息:那么这个常量池跟方法区的运行时常量池有什么关系呢,这里的常量池加载进内存就叫运行时常量池,常量池包括了各种字面量和对类型、域、方法的符号引用,具体为数量值,字符串值,类引用,字段引用,方法引用。为什么需要常量池一个java源文件编译会形成一个字节码文件,但是字节码文件里其实是需要其他数据支持的,如果将其他数据也一并放入此字节码文件中,则会使得字节码文件变得贼大。那么如果放的是引用呢,那么就会极大地缩小字节码的大小。原创 2021-11-04 21:10:53 · 226 阅读 · 0 评论 -
jvm方法区的内部结构
概述方法区内存存储的是类型信息、field域信息,方法信息 ,常量,静态变量,运行时常量池,即时编译器编译后的代码缓存。类型信息:对于类、接口、枚举、注解都要存储一下信息:1、类型的完整有效名称,比如说包名2、类型的直接父类的完整有效名称3、类型的修饰符4、类型的直接接口的一个有序的列表(因为接口可以多实现)域信息域名称、域信息、域修饰符(public,private,protected,static ,final volatile ,transient)方法信息方法名称、方法返回类型原创 2021-11-04 21:09:01 · 175 阅读 · 0 评论 -
jvm设置方法区大小的参数
jdk7及以前:通过-XX:PermSize 来设置永久代初始分配空间,默认值是20.75m-XX:MaxPermSize来设定永久代最大可分配空间,32位是64m,64位是82mjdk8及之后:通过-XX:MetaspaceSize 来设置永久代初始分配空间,默认值是21m-XX:MaxMetaspaceSize来设定永久代最大可分配空间,值为-1由于没有上限,因此当本机内存耗尽时,会抛出oom的错误,对于起始值21m来说,如果所使用的内存超过这个值,则会触发full gc卸载没用的类,之后将原创 2021-11-04 20:59:50 · 971 阅读 · 0 评论 -
jvm方法区的基本理解
概述方法区在逻辑上是堆的一部分,但因为一些简单的实现不会选择去进行垃圾收集或者压缩,所以可以把方法区看做是一块独立于java堆的内存空间方法区跟堆一样,是各个线程共享的区域方法区在启动的时候就创建了,实际内存可以是不连续的方法区的大小是可以扩展的或配置固定大小,大小决定了系统可以保存多少个类,如果加载的类过多则会报oom异常,如加载了大量的第三方jar包,tomcat部署的工程很多,有大量动态生成的反射类。关闭jvm就会释放方法区的内存方法区的演进jdk7之前是永久代,jdk8开始就使用元原创 2021-11-02 23:49:47 · 152 阅读 · 0 评论 -
jvm内存结构中方法区,堆、栈的关系
元空间是方法区的落地实现,永久代是方法区旧版的落地实现。从线程是否共享的角度来看从一段代码的调用实例看Person person=new Person();Person类信息是在方法区中,实例化出来的对象是放在堆中,对象的引用变量是在虚拟机栈的局部变量表中从程序执行来看在局部变量表中的引用是堆里的对象引用,而堆里的对象保留着对象类型的引用...原创 2021-11-02 23:46:00 · 105 阅读 · 0 评论