美文网首页
Java内存模型

Java内存模型

作者: 十丈_红尘 | 来源:发表于2019-02-20 23:44 被阅读0次

一 谈谈对Java内存模型的理解

1️⃣ 线程私有
补充知识点 :
1. 内存简介

32位 : 2^32 的可寻址范围;
64位 : 2^64 的可寻址范围;

2. 地址空间的划分

内核空间 : 指操作系统程序和C运行时的空间,包括调度程序等;
用户空间 : Java程序运行时实际使用的空间;

3. Java内存模型JDK1.8
4. 程序计数器

 1. 当前线程所执行的字节码的行号指示器;
 2. 改变计数器的值来选取下一条需要执行的字节码指令;
 3. 和线程是一对一的关系也就是线程私有的;
 4. 对Java方法技术,如果使用的Native方法则计数器值为Undefined;
 5. 没有内存泄露的问题;

5. Java虚拟机栈

 1. Java方法执行的内存模型;
 2. 包含多个栈帧;

6. 递归为什么会抛异常?

 1. 递归过深,栈帧数超出虚拟机栈深度;
 2. 解决办法 : 限制递归深度或者使用循环;

7. 虚拟机栈过多很发生OOM异常;

 1. 死循环;

8. 本地方法栈

 1. 与虚拟机栈相似,主要作用于标注了Native的方法;


2️⃣线程共享
1. 元空间与永久代的区别以及使用元空间的好处.

 1. 元空间使用的是本地内存,永久代使用的是JVM的内存;
 2. 字符串常量池存在永久代中,容易出现性能问题和内存溢出;
 3. 类和方法的信息大小难以确认,给永久代的大小指定带来困难;
 4. 永久代会为GC带来复杂度;
 5. 方便与其他JVM继承;

2. Java堆

 1. 对象实例的分配区域;
 2. GC管理的主要区域;


3️⃣常见问题解析
1. JVM三大调优参数 -Xms -Xmx -Xss的含义?

 -Xss : 每个线程虚拟机栈以及堆栈的大小,常用配置256k,影响并发线程数大小;
 -Xms : 初始堆大小;
 -Xmx : 堆能达到的最大值;

2. Java内存模型中堆和栈的区别.

 1. 首先讲明白的这个问题,就需要明白内存分配策略;通常内存分配策略有三种:①静态的,②栈式的,③堆式的;
  静态类型 : 编译时确定每个数据目标在运行时的存储空间;
  栈式类型 : 数据区需要在编译时未知,运行时且在进入程序模块前确认;
  堆式类型 : 编译时或运行时都未知,然后通过动态分配;
 2. 其次还需要明白堆和栈之间的联系,引用对象以及数组时,栈里定义变量来保存堆中的首地址;
 3. 在明白了以上两点以后他们之间的区别就显而易见了:
  管理方式不同 : 栈自动释放,堆需要等待GC;
  空间大小 : 栈比堆小;
  碎片相关 : 栈产生的碎片远小于堆;
  分配方式 : 栈支持静态和动态分配,堆只支持动态分配;
  效率不同 : 栈比堆效率高;

3. 元空间和堆以及线程独占部分之间的联系.

 元空间 : 当类被加载进来的时候,元空间中存储类相关信息(方法以及属性等);
 堆 : 当类被创建的时候,堆中主要存储的是类对象实例;
 线程独占部分 : 当程序运行时,JVM会分配虚拟机栈以及程序计数器等并且存储地址引用;

4. 不同JDK版本之间intern()方法的区别?

 JDK6 : 当调用intern方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用.否则,将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用;
 JDK6+ : 当调用intern方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用.否则,如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在,则在池中创建该字符串并返回其引用.

相关文章

网友评论

      本文标题:Java内存模型

      本文链接:https://www.haomeiwen.com/subject/goikyqtx.html