首页 > 试题广场 >

以下哪个不属于JVM堆内存中的区域()?

[单选题]
针对jdk1.7,以下哪个不属于JVM堆内存中的区域()?
  • survivor区
  • 常量池
  • eden区
  • old区
jvm堆分为:新生代(一般是一个Eden区,两个Survivor区),老年代(old区)。
常量池属于 PermGen(方法区)

编辑于 2017-08-18 15:56:08 回复(10)
java7,字符串常量池从方法区移到堆中。java8 整个常量池从方法区中移除。方法区使用元空间(MetaSpace)实现
发表于 2017-09-21 16:02:24 回复(6)
堆可以分为两部分:新生代,老年代。
新生代:1/3的堆空间 老年代:2/3的堆空间
而新生代可以细分:8/10的Eden区。2/10的Survivor区
Suivivor又可以细分为From区和To区,各占一半。

注意:
1.永久代MetaData在jdk1.8之前属于堆,现在属于物理内存,与堆完全隔开了
2.方法区只是逻辑概念,MetaData永久代和元空间是实实在在存在的,不能混为一体,元空间是方法区的具体实现。


编辑于 2018-12-26 10:11:07 回复(6)
选B
堆中的内存可以为了新生代和老年代,新生代由可以分为一个Survivor和两个Eden(From,To),默认比例8:1:1。
其实这个题有问题,从JDK7开始,常量池就从方法区中被移了到了堆(Hotspot叫做永久代),JDK8的时候,永久代被元空间代替。但是这个字符串常量池可是一直都在堆中的。
这里先说一下,方法区和永久代只是针对于HotSpot而言,在JDK7之前是一个概念,对于别的虚拟机而言,可没有什么永久代,只有方法区。
为什么HotSpot把永久代取消了呢,主要是因为这块地方的GC机制和堆邦定在一起,但是因为它不是堆,所以每一个GC收集器都需要有很大一部分代码去专门实现这个区域的垃圾,其次,每次一开始为永久代分配内存的时候,因为无法估量对象的大小,所以总是很难分配合适的内存,还容易出现OOM,所以取代成了元空间。元空间的话相当于一个内地内存,所以基本不会出现什么OOM,但是内存泄漏还是有的。
发表于 2018-07-24 10:48:38 回复(2)
《Something Just Like This》,网上关于这首歌有一个热评: 你背单词时,阿拉斯加的鳕鱼正跃出水面; 你算数学时,太平洋彼岸的海鸥振翅掠过城市上空; 你晚自习时,极图中的夜空散漫了五彩斑斓。 但是少年你别着急,在你为自己未来踏踏实实地努力时,那些你感觉从来不会看到的景色,那些你觉得终身不会遇到的人,正一步步向你走来。
发表于 2018-11-23 01:16:46 回复(6)
堆:新生代,老年代,默认大小比 1:2;
新生代:一个Eden区+两个Survivor区,默认大小比8:1:1
比例可以自行设置。
编辑于 2019-08-13 17:12:11 回复(0)
  1. java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变
  2. java7中,static变量从永久代移到堆中
  3. java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中
发表于 2019-02-12 10:45:08 回复(0)
Java堆内存是这样划分的:

发表于 2020-10-17 15:42:53 回复(0)
JDK7
发表于 2017-12-04 17:02:36 回复(0)
个人觉得这个题有点老了,因为在jdk9以后,常量池就分配在堆空间中了
发表于 2020-07-13 22:04:31 回复(0)
jvm堆分为:
新生代(一般是一个Eden区,两个Survivor区 from to)
老年代(old区)。

而常量池属于 PermGen(方法区)
发表于 2019-09-16 18:57:25 回复(0)
JVM内存分为堆内存和非堆内存,而堆内存分为新生代和老年代,非堆内存就一个永久代,新生代包含一个eden区和两个survivor区(fromspace,tospace)
编辑于 2019-04-01 13:22:27 回复(0)
Java8出现变化,题目需要加上Java版本
发表于 2017-10-12 00:35:53 回复(0)
常量池属于方法区
发表于 2021-09-05 21:25:48 回复(0)

发表于 2020-05-04 14:09:45 回复(0)
内存分为新生代 (2Eden区  1survivor区) 老年代  (old)  和方法区(含有常量池)
发表于 2019-07-19 22:48:16 回复(0)

JVM堆内存主要分为三个部分:

  1. Eden区:这是对象最初被创建的地方。
  2. Survivor区(包括From Survivor区和To Survivor区):这是用于存储在Eden区和From Survivor区之间进行垃圾回收后幸存的对象。
  3. Old区(也称为Tenured区):这是存储生命周期较长的对象的地方。

常量池是一块特殊的内存区域,用于存放编译期生成的各种字面量和符号引用。它不是堆内存的一部分,而是方法区的一部分。(本回答来自GTP,仅供各位参考)

发表于 2023-11-04 23:01:40 回复(0)
在JDK 1.7中,JVM堆内存主要分为三个区域:新生代、老年代和永久代。 1.新生代(Young Generation):新生代分为Eden区和两个Survivor区,其中一个Survivor区称为From区,另一个称为To区。当一个对象被创建时,它首先被分配到Eden区,如果Eden区满了,那么这些对象会被移到其中一个Survivor区,当这个Survivor区满了,里面的对象会被移动到另一个Survivor区或者老年代,这个过程称为Minor GC。 2.老年代(Old Generation):老年代主要存放长生命周期的对象,当新生代中的对象经过多次Minor GC之后仍然存活,那么它们就会被移到老年代中。老年代的大小比新生代大很多,因为长生命周期的对象会越来越多,而且老年代中的对象不容易被回收,所以老年代的垃圾回收时间比较长,一般称为Full GC。 3.永久代(Permanent Generation):永久代主要存放的是JVM加载的类信息、常量、静态变量等数据。在JDK 1.7中,永久代的大小是固定的,如果加载的类信息、常量、静态变量等数据过多,就容易导致永久代溢出,这个问题在JDK 1.8中被解决,JDK 1.8中使用元数据区代替了永久代。 总的来说,JVM堆内存中的区域主要是为了优化垃圾回收的效率,因为新生代中的对象生命周期较短,所以采用不同的垃圾回收算法;老年代中的对象生命周期较长,采用不同的垃圾回收算法可以提高效率;而永久代主要存放的是JVM加载的类信息、常量、静态变量等数据,因此在JDK 1.8中被替换成了元数据区。
发表于 2023-04-11 11:06:02 回复(1)
看过一篇帖子:
java7中,常量池位于方法区,方法区是一块堆外内存。
java8及以后,常量池从方法区移除,方法区被改为元空间;在逻辑上常量池属于方法区,实际上常量池(运行时常量池和字符串常量池)位于堆区。
不知道这个对不对。
发表于 2022-08-15 14:08:02 回复(0)
这里的常量池应该指的是运行时常量池吧  1.7中 运行时常量池在方法区中  方法区不属于JVM堆内存  并且1.7中将字符串常量池和静态变量移入堆内存中
发表于 2022-05-09 09:46:46 回复(1)