ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Java内存区域

2020-12-10 20:02:15  阅读:171  来源: 互联网

标签:abc Java 常量 对象 句柄 区域 内存


Java内存区域

常见面试题:

  • 介绍下 Java 内存区域(运行时数据区)
  • Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
  • 对象的访问定位的两种方式(句柄和直接指针两种方式)

拓展问题:

  • String类和常量池
  • 8种基本类型的包装类和常量池

 


 介绍下 Java 内存区域(运行时数据区)?

 

    https://juejin.cn/post/6844903663496871943  图

   

 

虚拟机VM栈:

  局部变量表:8种基本数据类型 +对象引用

  两种异常:StackOverFlowError:JVM栈内存大小不允许动态扩展时,线程请求栈超过VM栈最大深度时。

       OutOfMemoryError:JVM栈内存大小允许动态扩展,且内存用完而无法动态扩展时(无法申请到内存)。

本地方法栈:虚拟机栈为Java方法 字节码服务,本地方法栈为Native方法服务。

 

堆:

  JVM启动时,存放 对象实例、数组

  Java堆是GC垃圾收集器管理的主要区域

 

方法区:

  类信息、常量、静态变量、编译后的代码

  运行时常量池:存放编译期生成的各种字面量和符号引用

 


Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)?

 

 

1)类加载检查:

  JVM检查:1. 能否在常量池中定位  类的符号引用?  2.类是否被加载、解析、初始化过?

2)分配内存:

  从堆中分配内存;方式有1.指针碰撞  2.空闲列表

   内存分配并发问题(线程安全):

     1. CAS+失败重试。CAS是乐观锁,遇到失败就不断重试。

     2. TLAB。为每个线程预先分配一块内存,当TLAB内存不够用时,再采用CAS方法分配。

 3)初始化零值:

   将分配的内存全初始化为0(不包括对象头),这样直接可用

 4)设置对象头:

  对象信息存放在对象头中。1. hashCode、GC分代年龄、锁状态标志   2. 对象指向它的类的指针 

 5)执行init方法:

    按照java程序进行inti初始化

 


 对象的访问定位的两种方式(句柄和直接指针两种方式)?

  通过栈上的引用来操作堆上的对象,访问方式由JVM决定:使用句柄 / 直接指针 

1)句柄:引用指向句柄,句柄池中存储:对象实例数据 (堆) / 对象类型数据 (方法区)

2)直接指针:引用直接指向 对象实例数据 (堆),然后再从堆指向 对象类型数据 (方法区)


String类和常量池 ?

  

 

  str1指向常量池已有对象;str2指向堆里新建的对象

  str1 != str2 对象内容相同,但不是同一个对象

     


s1指向堆中的对象;s3常量池(双引号的都是常量池);s2使用intern在常量池中创建字符串(intern在常量池中有字符串时直接用,没有时会新建字符串)

   


 字符串拼接的情况:

  

  

 


String s1 = new String("abc");这句话创建了几个对象? 2个

  先有字符串"abc"放入常量池,   然后 new 了一份字符串"abc"放入Java堆 (字符串常量"abc"在编译期就已经确定放入常量池,而 Java 堆上的"abc"是在运行期初始化阶段才确定),   然后 Java 栈的 s1 指向Java堆上的"abc"。  

8种基本类型的包装类和常量池 ?

  除了Float和Double没有实现常量池技术(所以每次都会在堆上新建对象)

  其他6种,都实现了常量池技术,默认创建了数值[-128,127]缓存数据(仅在此范围有常量池,超出就没有了)

  


 

 

标签:abc,Java,常量,对象,句柄,区域,内存
来源: https://www.cnblogs.com/qyf2199/p/14111025.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有