下面有关JVM内存,说法错误(  )

  1. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
  2. Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
  3. 方法区用于存储JVM加载的类信息、常量、静态变量、即使编译器编译后的代码等数据,是线程隔离的
  4. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
2 2 收藏


直接登录
最新评论
  • 选3, 不会存放编译后的代码数据。

  • alexhilton 程序猿 2016/01/08

    3. 后半段是错的。”编译器编译后的代码等数据,是线程隔离的。”编译器编译后的代码是bytecode,怎么可能是线程隔离的。

    • 王先生 学生 2016/01/09

      方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

  • puer   2016/01/09

    (c)
    JIT编译后的代码放在code_cache中而非Perm区,这个是一个JVM一份,而一个JVM只跑一个process,这份数据是thread共享的。
    不过1.8之后JVM已经取消了Perm区,改而用metaspace。

  • 王先生 学生 2016/01/09

    选择C
    方法区用于存储JVM加载的类信息以及类相关的东西,比如类变量、常量,但不会存放编译后的代码数据。
    由于方法区是对类来说是公用的,因此为避免造成冲突,必须是线程隔离的。

  • 看到评论有人在一本正经地胡说八道,看不下去了。

    答案确实是C,错在“线程隔离”。(正确应为:线程共享)

    “方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据”(出自《深入理解Java虚拟机》周志明著,第2章 Java内存区域 2.2.5 方法区一节)