• 张学磊
    2019-07-09
    String a="b"可能创建一个对象或者不创建对象,如果"b"这个字符串在常量池里不存在会在常量池创建一个String对象"b",如果已经存在则a直接reference to这个常量池里的对象;
    String c= new String("b")至少创建一个对象,也可能两个,因为用到new关键字,会在堆内在创建一个的String对象,它的值是"b"。同时,如果"b"这个字符串在常量池里不存在,会在常量池创建这个一个String对象"b"。

    作者回复: 对的

    
     25
  • Xiao
    2019-07-09
    老师,这儿其实应该说JVM内存结构更合适!JVM内存模型是一种规范,和JVM内存结构不是一个概念。其次,元空间,在Java8,不是在堆内分配的,它的大小是依赖于本地内存大小!

    作者回复: 感谢Xiao同学的提醒。

    我想你说的内存模型应该是指Java内存模型(JMM)吧。这里的JVM内存模型跟Java内存模型是不一样的,这里的JVM内存模型和和内存结构是一个意思。

    元空间是分配的本地内存,文中开始描述不清楚(已纠正),但后面有明确说明。

    
     14
  • Liam
    2019-07-09
    请教一个问题,所以1.8开始,方法区是堆的一部分吗?也即是说,方法区的大小受限于堆

    作者回复: 方法区不是堆的一部分,方法区和堆存在交集。方法区的静态变量和运行时常量池存放在堆中,但类的元信息等还是存放在了本地内存中。

     1
     5
  • 我又不乱来
    2019-07-09
    String a="b"应该会放在字符串常量池中。
    String c= new String("b") 首先应该放在 堆中一份,再在常量池中放一份。但是常量池中有b了。
    第一次留言。不知道理解的对不对。超哥

    作者回复: 正确

    
     5
  • Gred
    2019-08-02
    老师,运行时变量应该都在方法区中,从java7开始只有字符串常量池移到堆中而已

    作者回复: 严格来说,是静态常量池和运行时常量池,静态常量池是存放字符串字面量、符号引用以及类和方法的信息,而运行时常量池存放的是运行时一些直接引用。

    运行时常量池是在类加载完成之后,将静态常量池中的符号引用值转存到运行时常量池中,类在解析之后,将符号引用替换成直接引用。

    这两个常量池在JDK1.7版本之后,就移到堆内存中了,这里指的是物理空间,而逻辑上还是属于方法区(方法区是逻辑分区)。

    
     3
  • 东方奇骥
    2019-07-12
    老师,问一下,1.8静态变量和常量存储在的堆里面,那元空间里是什么?文中说之前永久带类的数据存储在了元空间,不是很理解,

    作者回复: 元空间主要存储类的一些信息,包括方法、字段、类等描述类信息。

    
     3
  • 帽子丨影
    2019-08-20
    元空间的存储位置时本地内存,请问下本地内存是个什么东西,在第一张图里没找到啊。

    作者回复: 本地内存是一种非JVM堆内存

    
     1
  • 发条橙子 。
    2019-07-20
    老师,这句话怎么理解

    之前永久代的类的元数据存储在了元空间,永久代的静态变量(class static variables)以及运行时常量池(runtime constant pool)则跟 Java7 一样,转移到了堆中。

    方法区的一部分是由永久代实现的,永久代主要存储类的静态数据以及运行时常量池并储存在堆内存中。 但是由于容易发生permen内存溢出,后来就发明了元数据空间。那我理解元空间除了存储之前方法区的类信息还包括之前放在永久代中的 静态变量 和 运行时常量池 。
    文中为什么说和jdk7一样还是转移到堆中,那不是没有变化么?
    展开

    作者回复: 是的,没有变化。

    
     1
  • 晓杰
    2019-07-11
    创建一个线程,就会在虚拟机中申请一个栈帧,这句话有问题吧
    应该是创建一个线程,会创建一个栈,然后方法调用一次,就会申请一个栈帧吧

    作者回复: 对的,这里是申请一个线程栈。

    
     1
  • Cain
    2019-07-10
    常量池在哪个区?堆区?栈区?方法区?静态区?方法区,静态区他俩是什么关系?

    作者回复: 在逻辑空间是属于方法区。堆、栈、方法区等,这些是一种规范,是逻辑上的分区。

    在物理空间中,常量池是存储在堆内存空间的。

    
     1
  • 黑夜里的猫
    2019-07-09
    字符串常量不是在java8中已经被放入到堆中了吗,应该不在方法区中了,但是看到老师的图中还在方法区中

    作者回复: 方法区是一个规范,并不是一个物理空间,我们这里说的字符串常量放在堆内存空间中,是指实际的物理空间。

    
     1
  • 听雨
    2019-07-09
    元空间不是本地内存吗,老师说的元空间移入堆内存是什么意思呀,不理解,是元空间属于堆内存的一部分吗?

    作者回复: 而到了 Java8,永久代被元空间取代了,元空间存储静态变量...

    以上这句话描述不准确。将元空间去掉。元空间是使用的本地内存,在后面讲述到了:“并且元空间的存储位置是本地内存”

    
     1
  • 超威丶
    2019-07-09
    其实常量池中是不会存储具体对象的吧,也是引用,所以说new String的话会现在常量池中去寻找,存在直接由常量池中的引用指向堆中对象,不存在直接开辟新对象?

    作者回复: 字符串常量存储在了常量池,引用在运行时存放在了栈中。new String("")是会创建一个新对象的,可以查看一下构造函数:
        public String(String original) {
            this.value = original.value;
            this.hash = original.hash;
        }

    
     1
  • TerryGoForIt
    2019-07-09
    老师您好,我想问一下,深入理解 JIT 放到下一节了嘛?我看课程目录 JIT 是在 JMM 之前哇。

    作者回复: 是的,调换下位置方便更好理解JIT,因为JIT用到了JVM内存的知识点。声明下,这里不是JMM,JMM是Java Memory Model,而我们这节讲的是JVM的内存模型(Java Virtual Machine Structure)。

    
     1
  • 将军
    2019-12-20
    老师,这应该不叫内存模型,叫内存区域吧。内存模型不是主内存和工作内存的同步吗?

    作者回复: 我们说的是JVM的内存模型(Java Virtual Machine Structure),不是JMM(Java Memory Model)。

    
    
  • 斐波那契
    2019-11-23
    老师 看完这个 对于运行时常量池和字符串常量池有点搞不清 是不是运行时常量池包括字符串常量池还是说这两个是不同的东西?

    作者回复: 两者有区别,通常方法区中有静态常量池和运行时常量池,静态常量池主要存储的是字面量以及符号引用等信息,而运行时常量池存储的是类运行加载时生成的直接引用等信息。静态常量池也包括了我们说的字符串常量池。

    
    
  • Malcolm。
    2019-11-13
    print 静态方法属于 JVMCase 类 JVMCase 类在方法区 所以静态方法也是在方法区是吧
    
    
  • ZHANG
    2019-10-31
    老师,是这样吗,java8中类的静态变量,运行时常量池,字符串常量池都在堆中,那元空间只有一些类的信息了,比如版本什么的。
    
    
  • 谭震弘
    2019-10-18
    由于 Java 是多线程语言,当执行的线程数量超过 CPU数量

    这里cpu数量不对把,应该是cpu核数?

    作者回复: 对的,此处的数量是指CPU核数

    
    
  • 丁浪
    2019-10-17
    你的理解跟我不太一致,说下我的理解。
    jdk7以前,常量池都是存放在方法区,也就是永久代中。jdk7的时候,只是把“字符串常量池”从方法区/永久代中移除了,“运行时字符串”其实还没变的。jdk8的时候,只是用元空间取代了以前的永久代,“字符串常量池”在堆中,“运行时常量”、类的元数据信息等等都在元空间。元空间属于非堆,使用的是本地内存。

    作者回复: 从官方文档解释,class metadata is stored in a new space called Metaspace,所以并没有指出有其他内容存放在元空间。具体的可以参考以下链接:
    https://www.oracle.com/webfolder/technetwork/tutorials/mooc/JVM_Troubleshooting/week1/lesson1.pdf

    
    
我们在线,来聊聊吧