美文网首页
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