求教JDK1.8内存模型。。。。

看完JVM内存模型一章,大致对各个内存区的作用有了了解,但是细究起来又存在问题,例程代码如下:
public class MemoryDump {
/***********************成员数据******************/

/**
* 常量:普通常量、静态常量、引用常量
*/
final int a0 = 1;//?- 方法区(元空间)
final String b0 = "hello";//?- 堆常量池
final String c0 = new String("hello");//?- 堆区

static final int a1 = 1;//?- 方法区(元空间)
static final String b1 = "hello";//?- 堆常量池
static final String c1 = new String("hello");//?- 堆区

/**
* 变量:普通变量、静态变量、应用变量
*/
int a2 = 1;//?- ?
String b2 = "hello";//?- 堆常量池
String c3 = new String("hello");//?- 堆区

static int a4 = 1;//?- 方法区(元空间)
static String b5 = "hello";//?- 堆常量池
static String c6 = new String("hello");//?- 堆区

public static void main(String[] args){
/******************局部数据****************/
/**
* 常量:普通常量、引用常量
*/
final int a0 = 1;//?- ?
final String b0 = "hello";//?- 堆常量池
final String c0 = new String("hello");//?- 堆区

/**
* 变量:普通变量、引用变量
*/
int a2 = 1;//栈区 - 栈区
String b2 = "hello";//栈区 - 堆常量池
String c3 = new String("hello");//栈区 - 堆常量池

}
}

可见大部分实际数据存储位置还是知道的,但是实际数据所在的引用到底存放在哪呢?不知道上图写的有没有错误,坑请指正,同时希望有人解答一下?所值的位置,不胜感激。。。。
全部评论
普通变量应该是存放在对应的栈区, 局部常量用得少吧?? 一般内部类啥的可能会用到吧 不是很了解,我觉得也应该在常量池里
点赞 回复 分享
发布于 2017-11-27 23:51
小弟不才,个人认为你注释都是正确的。 小弟说的不一定对,仅供参考,见谅。 1,类变量的对象引用是存放在堆用的方法区,就是存放类(Class对象)的地方,jdk8之后就把这块内存合并到堆中了 2,成员变量的对象引用存放在堆中,因为成员变量是属于实例对象的,所以存放在堆中理所应当 3,局部变量中的对象引用存放在当前活动栈中 4,集合类,数组中对象的引用也是存放在堆中的 这些引用在传递引用时会在各个内存区域复制 基本类型没有引用,final并不决定引用的存放位置 把垃圾收集的可达性分析忘的差不多了,不敢在此推论,怕说错了
点赞 回复 分享
发布于 2017-11-28 00:00
只有final没有static的变量并不是在方法区的吧?它就是一个普通变量加上不可修改的属性
点赞 回复 分享
发布于 2017-11-28 10:39
我去百度了下,final确实是不改变引用位置的,也不改变变量生命周期。String字面量特殊,不在考虑范围之内,jvm会对其优化的。至于final为什么能让引用不变,这个原理还不清楚,明天去搜,睡觉
点赞 回复 分享
发布于 2017-11-29 00:06
请问您看的什么书。求推荐
点赞 回复 分享
发布于 2017-12-02 13:17

相关推荐

Cassifa:发的字比你都多的一律视为骗子或者想白嫖压榨实习生的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务