首页 > 试题广场 >

关于Java内存区域下列说法不正确的有哪些

[不定项选择题]
关于Java内存区域下列说法不正确的有哪些
  • 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器,每个线程都需要一个独立的程序计数器.
  • Java虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧,用于存储局部变量表、类信息、动态链接等信息
  • Java堆是java虚拟机所管理的内存中最大的一块,每个线程都拥有一块内存区域,所有的对象实例以及数组都在这里分配内存。
  • 方法区是各个线程共享的内存区域,它用于存储已经被虚拟机加载的常量、即时编译器编译后的代码、静态变量等数据。
太痛苦了
发表于 2019-09-02 00:10:31 回复(13)
A.程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器(偏移地址),Java编译过程中产生的字节码有点类似编译原理的指令,程序计数器的内存空间存储的是当前执行的字节码的偏移地址,每一个线程都有一个独立的程序计数器(程序计数器的内存空间是线程私有的),因为当执行语句时,改变的是程序计数器的内存空间,因此它不会发生内存溢出 ,并且程序计数器是jvm虚拟机规范中唯一一个没有规定 OutOfMemoryError 异常 的区域;

B.java虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。  没有类信息,类信息是在方法区中

C.java堆:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组

D.方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

上面部分内容从下面文章中总结:

发表于 2019-09-11 19:59:28 回复(20)
B.类信息不是存储在java虚拟机栈中,而是存储在方法区中;
C.java堆是被所有线程共享的一块内存区域,而不是每个线程都拥有一块内存区域。
发表于 2019-11-13 20:44:38 回复(7)
要不然你们就把这题的jdk版本限定了,d选项我不否认静态变量1.6在方法区,但是1.7以后呢,不是跑到堆中了吗?还有c选项,这也太绝对了吧,首先在分配对象内存空间的时候不是应该给每个线程都开了一个TLAB吗?不就给每个线程一个私有区域了,就算这个空间可能很小,那也不能直接说他没有吧?那你就直接说都是共享,我不知道你什么意思。而且对象都是分配在堆中,逃逸分析后允许栈上分配的情况呢?就算逃逸分析在hotspot上没有去应用开来,那你是不是也该指定下是那种虚拟机?做了好几遍了,也知道正确答案是啥,但我还是不想这样做对。要是觉得我哪里说错了,那就请指正我,乐意听教。要是我说的没问题,就麻烦你们完善下题目的bug
编辑于 2020-10-23 10:17:41 回复(5)
Bjava虚拟机栈不包括类信息,C内存区域,所有线程共享
发表于 2019-08-22 10:32:25 回复(0)
😎😎😎
发表于 2020-07-20 18:36:30 回复(0)

一、 程序计数器

一块较小的内存空间,可以看作是当前线程所执行的字节码的信号指示器。在虚拟机的概念模型里面,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要以来这个计数器完成。

由于Java虚拟机的多线程是通过线程轮流切换分配处理器执行时间的方式来实现,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正常的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

如果线程正在执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,计数器值应为空(Undefined)。

二、 Java虚拟机栈

与程序计数器一样,它也是线程私有的。

Java虚拟机栈描述的是Java方法执行的线程内存模型
每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表操作数栈动态连接方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

什么是局部变量表:
存放了编译器可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,她并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long、double类型的数据会占用两个变量槽,其余的只占用一个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

三、 Java堆

Java堆(Java Heap)虚拟机管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建

此内存的唯一目的就是:存放对象实例。

因此,Java堆也是垃圾收集器管理的内存区域。


四、 方法区

与Java堆一样,方法区是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息常量静态变量、即时编译器编译后的代码缓存等数据。
D选项不够严谨,代码缓存和代码,还是有区别的!
发表于 2021-04-28 13:16:04 回复(0)
堆和方法区都是是线程共享的
发表于 2019-09-02 20:25:19 回复(0)
Bjava虚拟机栈不包括类信息,C内存区域,所有线程共享。
发表于 2022-05-13 22:07:34 回复(0)
aaa,十道提就对2道,emo了
发表于 2021-12-16 15:37:26 回复(0)
B.类信息不是存储在java虚拟机栈中,而是存储在方法区中;
C.java堆是被所有线程共享的一块内存区域,而不是每个线程都拥有一块内存区域。
发表于 2021-09-28 16:14:57 回复(0)
jvm栈没有类信息,类信息在方法区
发表于 2020-04-03 19:46:09 回复(0)
B, 没看到答案里面还有类信息,类信息在方法区中存储
发表于 2022-02-03 09:38:40 回复(0)
又是这样我选了BCD交了之后我选的D就没了???!!!
发表于 2021-12-21 19:43:15 回复(0)
A.程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器(偏移地址),Java编译过程中产生的字节码有点类似编译原理的指令,程序计数器的内存空间存储的是当前执行的字节码的偏移地址,每一个线程都有一个独立的程序计数器(程序计数器的内存空间是线程私有的),因为当执行语句时,改变的是程序计数器的内存空间,因此它不会发生内存溢出 ,并且程序计数器是jvm虚拟机规范中唯一一个没有规定 OutOfMemoryError 异常 的区域; B.java虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。  没有类信息,类信息是在方法区中 C.java堆:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组 D.方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 上面部分内容从下面文章中总结: https://blog.csdn.net/qq_41701956/article/details/81664921
发表于 2021-10-31 15:59:25 回复(0)
B.类信息不是存储在栈中,是存储在方法区的。
C.首先堆是线程共享的,不是线程私有的,还有就是并非所有的对象都是在堆上分配的,在开启了逃逸分析和标量替换的情况下,java虚拟机会优先将对象分配在栈上而不是在堆进行分配的。
发表于 2021-10-13 14:01:30 回复(0)
题目应该将jdk版本说清楚,在Java虚拟机中(HotSpot)
jdk1.6及之前:静态变量和字符串常量池存放在永久代。
jdk1.7及之后:静态变量和字符串常量池存放在堆空间。

对于C选项有点问题,在给对象分配的时候优先将对象存入年轻代中的TLAB区域中中,TLAB这块区域很小,并且不是共享的,每个线程独立拥有。如果TLAB装不下对象,则考虑存入年轻代或者老年代。
编辑于 2021-03-11 20:04:14 回复(0)
要着眼睛有何用,成功避开所有正确答案
发表于 2020-05-17 17:36:14 回复(1)
BC
B虚拟机栈 局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)
Java 堆是所有线程共享的一块内存区域  几乎所有的对象实例以及数组都在这里分配内存。
发表于 2019-08-21 11:08:05 回复(0)