一 谈谈对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堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在,则在池中创建该字符串并返回其引用.
网友评论