堆:
是什么?
是java内存区域中一块用来存放java对象实例的区域,几乎所有的数组和对象实例都在这里分配内存。
为什么?
此内存区域的唯一目的就是存放对象实例[数组和对象]
java堆(java Heap)是java虚拟机所管理的内存中最大的一块java堆是被所有线程共享的一块内存区域.
特点?
java堆是垃圾收集器管理的主要区域,因此被很多时候也被称之为 "GC"堆
-Xms -Xms
java堆可以分成新生代和老年代,新圣地啊可以分成To Space, From Space, Eden
方法区:
是什么?
是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据
类信息:类的版本号,方法,接口等等数据,是存在class文件里面的
下面是class文件,编译成字节码文件
为什么?
内存中存放类信息,静态变量等数据,属于线程共享的一块区域
Hotspot使用永久代来实现放法区, JRockit、IBM、J9VM这些厂商是没有永久代概念的 ,HotSpot是为了更好的管理内存,为了像java堆那样管理内存,所以把永久代放到方法区里面,为了通过垃圾回收器来管理这部分的内存,多次对象还没有被回收的时候就可以放到永久代里面。
有人把永久带和方法区混在一起,其实在HotSpot里面用永久代来实现方法区的
特点?
并非数据进入了方法区就如永久代的名字一样”永久“存在了,而是相对永久这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,只是部分永久。
当方法区无法满足内存分配的时候就会抛出OutoMemoryError,当Class文件非常大的时候就会报这个异常,方法区没有像java堆分配的内存那么多
JVM内存模型之方法区运行时常量池
是什么?
运行时常量池是方法区的一部分,Class文件除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中的存放。
运行时常量池的模拟
特点:StringTable来维护的:HashSet的数据结构
运行时常量池时方法区的一部分,受到方法区内存的限制,当常量池再申请到内存时会抛出OutOfMemoryError异常。