JDK8
程序计数器:
当前线程所执行的字节码行号指示器(逻辑)、
改变计数器的值来选取下一条需要执行的字节码指令、
和线程1对1、对java方法计数,
如果是native方法则为undefined、不会发生内存泄漏
虚拟机栈:
java方法执行的内存模型
包含多个栈帧(栈帧包含:局部变量表 操作数栈 动态链接 返回地址)
元空间:
元空间替代永久代,使用本地内存,永久代使用的是JVM内存
类加载信息:CLass Method Field System(Class)
堆
对象实例的分配区域
GC管理的主要区域
JVM三大性能调优参数-Xms -Xmx -Xss的含义
-Xss:规定了每个线程虚拟机栈(堆栈)的大小,一般配置256k足矣,此配置将会影响此进程中并发线程数的大小
-Xms:堆的初始值
-Xmx:堆能达到的最大值
Java内存模型中堆和栈的区别
内存分配策略:
静态存储:编译时确定每个数据目标在运行时的存储空间需求
栈式存储:数据区需求在编译时未知,运行时模块入口前确定
堆式存储:编译时或运行时模块入口都无法确定,动态分配
联系:引用对象、数组时,栈里定义变量保存在堆中目标的首地址
区别:
1.管理方式:栈自动释放,堆需要GC
2.空间大小:栈比堆小
3.碎片相关:栈产生的碎片远小于堆
4.分配方式:栈支持静态和动态分配,而堆仅支持动态分配
5.效率:栈的效率比堆高
元空间、堆、线程独占部分间的联系(内存角度)
元空间:CLass Method Field System(Class)
堆:Object
线程独占:虚拟机栈、本地方法栈、程序计数器
JDK版本之间的差异
intern方法(JDK6/JDK789):String s = new String("a");s.intern();
JDK6:当调用intern方法时,如果字符串常量池中先前已创建出该字符串对象,则返回池中的该字符串的引用。否则,将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。
JDK6+:(字符串常量池移到堆当中,而不是在永久代中)当调用intern方法时,如果字符串常量池中先前已创建出该字符串对象,则返回池中该字符串的引用。否则,㘝该淄川对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在,则在池中创建该字符串并返回。