《深入理解 Java 虚拟机》学习笔记 -- 内存区域

《深入理解 Java 虚拟机》学习笔记 -- 内存区域

运行时数据区域

主要分为 6 部分:

  1. 程序计数器
  2. 虚拟机栈
  3. 本地方法栈
  4. Java 堆
  5. 方法区

如图所示:

1. 程序计数器(线程私有)
  1. 程序计数器是当前线程所执行字节码的行号指示器
  2. 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
  3. 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器
  4. 执行 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;执行的是 Native 方法,计数器为空
  5. 程序计数器是唯一一个在 Java 虚拟机中不会出现 OutOfMemoryError 情况的区域
2. Java 虚拟机栈(线程私有)
  1. 每个方法被执行的时候都会同时创建一个栈帧
  2. 每一个方法被调用直至执行完成的过程,就对应者一个栈帧再虚拟机中从入栈到出战的过程
  3. ”栈内存“指的就是虚拟机栈中的局部变量表部分
  4. 局部变量表存放的是基本数据类型
  5. 局部变量表所需的内存空间再编译期间完成分配
  6. StackOverflowError : 线程请求的栈深度大于虚拟机所允许的深度
  7. OutOfMemoryError: 虚拟机栈动态扩展无法申请到足够的内存
3. 本地方法栈(线程私有)
  1. 运行本地方法
  2. 其他和 Java 虚拟机栈类似
4. Java 堆(线程共享)
  1. 在虚拟机启动时创建
  2. 存放对象实例
  3. 垃圾回收主要区域
5. 方法区(线程共享)
  1. 存储已被虚拟机加载的类信息,常量,静态变量,即编译器编译后的代码等数据
  2. 对常量池的回收和对类型的卸载

其他

运行时常量池
  1. 运行时常量池是方法区的一部分,

  2. 类加载后将 Class 文件中的常量池信息放到方法区的运行时常量池中

  3. String 类的 intern() 方法可以把运行期间新的常量放入池中

    String.intern() 方法的作用:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的 String 对象;否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用。

直接内存
  1. 直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域
对象的创建

步骤

  1. new 类名

  2. 根据 new 的参数在常量池中定位一个类的符号引用

  3. 如果没有找到这个符号引用,说明类还没有加载,则进行类的加载,解析和初始化

  4. 虚拟机为对象分配内存(位于堆中)

  5. 将分配的内存初始化为零值(不包括对象头)

这个很好理解,就是基本数据类型初始化为 0,引用类型初始化为 null。

  1. 调用对象的 <init> 方法

举例

请看下面例子:

public class Test {

    public static void main(String args[]) {
        
        String s1 = "abc";
        String s2 = "abc";

        System.out.println(s1 == s2);

        String s3 = new String("abc");

        System.out.println(s1 == s3);

        System.out.println(s1 == s3.intern());

    }
    
}

打印结果为:

true
false
true

解析:

  1. 第一个 true 是因为 "abc" 为字符串常量,是放在方法区中的,虽然会开启内存但是会统一指向到运行时常量池中的 HashSet,由 HashSet 统一管理,这时 s1, s2 指向的地址自然就是 HashSet,s1 == s2 当然为 true
  2. 第二个为 false 是因为 s3 是一个对象实例,实例是放在 Java 堆中,s1 是放在方法区中,两者地址不一样,所以为 false
  3. 第三个为 true 是因为 intern() 方法可以把新的常量放入池中,所以为 true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容