【JVM】【内存】内存分布

虚拟机的内存模型就如上图:深色部分是多个线程共享的,浅色部分是各个线程独享的

方法区
存放内容:存放着已经被虚拟机加载的类的信息,包括类信息(名称、修饰符等)、类中的field常量、静态变量等,当程序中通过class对象的getName,isinterface等方法获取信息时,这些数据都来源于方法区域;
描述:虽然常说把方法区归为堆的一部分,但他也有一个名字叫做非堆,目的是为了与堆区分开来;
参数配置:默认大小是16MB,最大为64MB,可以通过-XX:PermSize及-XX:MaxPermSize来指定最大值和最小值;
GC回收机制:当方法区的空间将要被占满的时候,会触发fullGC,如果GC之后仍然回收不了,就会抛出OutOfMemoryError异常。主要回收放弃的常量和无用的类。废弃的常量包含类、接口、方法字段等等;
参数配置推荐:增大方法区的内存配置,避免出发FuLLGC
常量池
存放内容:数据方法区的一部分,存放字面量和符号引用。其实就是变量的值和变量的引用,例如String a =“hello”,那么"hello" 就存在常量池中;
特性:JVM会在内存中维护一个常量池的hash表,当一个变量需要一个值时候(Integer a = new Integer(127)),首先去这个表里面查询是否已经存在该值如果存在,则取出;反之,创建一个新的;当然,既然引用的是一个内存,所以两个变量进行“=”比较的时候是相当的。
特性:八中基本类型的包装类都是用到常量池。但是需要注意的是:integer包装类只有值小于128的时候才会使用,因此,会出现在Integer a =128; integer b = 128 在进行a==b比较的时候是false,而如果他们的值都小于128,然后比较的时候就是true。(等号比较的是两个数据的内存空间);
常量池的内容是不可以改变的,具体查询资料“String变量为什么是不可变的”

概念:此块内存的唯一目的,就是存放创建出来的对象;
大小:32位默认最大2G大小 64位 没有限制
参数配置:-Xms 是JVM启动时候的最小内存大小,默认物理内存的1/64且内存小于1GB;
-Xmx可申请的最大heap内存默认为物理内存的1/4同样小于1GB;
当空余内存小于总内存的40%(默认值)时候,JVM会增加到最大Xmx指定的值,比例值可通过-XX:MinHeapFreeRatio=来指定这个比列;
当空余内存大于70%(默认值)时候,JVM会减小内存到Xms 指定的大小,比例值可通过-XX:MaxHeapFreeRatio=来指定这个比列;
分为老年代和年轻代
虚拟机的栈
概念:他的生命周期和线程相同,他是最经常时候用的,他是方法执行的内存模型,每当方法被执行的时候都会创建一个栈指针;
内容:用于存放局部变量、动态链接、方法出入口等信息;
异常:如果请求栈深度大于虚拟机允许的深度,例如递归方法调用,那么就会跑出StackOverflowError异常;
本地方法栈
和虚拟机栈类似的作用,只是他是为JVM的native方法服务的。
程序计数器
这个很简单,他表示当前线程执行的字节码的行号指示器,字节码的解释器在工作的时候就是通过程序计数器来控制线程需要执行的吓一条程序的字节码;
直接内存
它是不属于JVM内从的一块,准确的说,属于操作系统,但是这块内从也会被频繁的使用;
java的nio里面的directByteBuffer对象来控制这块内存对象的引用;

相关文章:

  • 2021-11-12
  • 2021-05-23
  • 2021-05-19
  • 2022-01-16
  • 2021-10-26
  • 2021-08-02
  • 2021-07-12
猜你喜欢
  • 2021-06-02
  • 2021-11-21
  • 2021-10-21
相关资源
相似解决方案