Java内存模型

Java内存模型(JDK8)

 

程序计数器:(Program Counter  Register)

当前线程所执行的字节码行号指示器(逻辑)

改变计数器的值来选取下一条需要执行的字节码指令

和线程是一对一的关系即“线程私有”

对Java方法计数,如果是Native方法则技术器的值为Undefined

不会发生内存泄露

Java 虚拟机栈(Stack)

Java方法执行的内存模型

包含多个栈帧

递归为什么会引发java.lang.StackOverflowError 异常

递归过深,栈帧数超过虚拟机深度

虚拟机栈过多,会引发java.lang.OutOfMemoryError异常

元空间(MetaSpace)与永久代(PermGen)的区别

 元空间使用本地内存,而永久代使用JVM内存

  java.lang.OutOfMemoryError:PermGen space

MetaSpace相比PermGen的优势

  1. 字符串常量池存在永久代中,容易出现性能问题和内存溢出。  
  2. 列和方法的信息大小难以确定,给永久代的指定带来困难。
  3. 永久代会为GC带来不必要的复杂性。

 

Java堆(Heap)

对象实例的分配区域

GC管理的主要区域

 

1.新生代:Eden+From Survivor+To Survivor

2.老年代:OldGen

3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)

常见问题

JVM 三大性能调优参数  -Xms -Xmx -Xss的含义

-Xss :  规定了每个线程虚拟机栈(堆栈)的大小,256k一般足够,影响此进程中,并发线程数的大小。

-Xms:  堆的初始值

-Xmx:  堆能达到的最大值

 

Java内存模型中堆和栈的区别 -  内存分配策略

静态存储: 编译时确定每个数据目标在运行时的存储空间需求

栈式存储: 数据区需求再编译是未知,运行时模块入口确定

堆式存储:编译时或运行时模块入口都无法确定,动态分配。

联系: 引用对象、数组时,栈里定义变量保存堆中目标首地址

 

 

感谢观看,感谢支持。

 

posted @ 2019-07-04 15:25  haoprogrammer  阅读(172)  评论(0编辑  收藏  举报