方法区

  1. 永久代:存储在“堆”上
  2. 元空间:存储在“直接内存”上

jdk8以后元空间取代了永久代

why元空间取代永久代?

  1. 32位机器支持的最大内存是4G,而操作系统分为应用层和内核层,各占2G。如果不放在堆上,而是放在直接内存上,随着加载类的多少,如果不受堆的限制,很有可能把内存占完,其他程序没内存可用。64位机器地址位原理上有64位,而目前16位为保留位,只有48位真正用于地址位,所以实际的最大内存为2^48B,即256TB,可用内存大幅增加,不用担心内存不足。
  2. 之前Java很少用于Web应用,而目前主要使用Java。随着Web的发展,Web应用越来越大,若方法区还放在堆上,还需要手动调节堆的大小,不太方便。

注意

  1. 常量池和静态变量因为在class对象中,所以都在方法区
  2. 只有对象存储在堆中
  3. class对象是静态概念,是类加载器解析class content之后放在方法区
  4. 对象是动态的概念,是对类的实现