Java虚拟机运行时数据区

java虚拟机运行时数据区

Java虚拟机运行时数据区_第1张图片

一、程序计数器(program Counter Register)线程私有
当前线程所执行的字节码的行号指示器,字节码解释器工作的时候通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理,线程恢复都依赖它完成。
此区域是唯一一个Java虚拟机规范中没有规定任何OOM情况的区域。
  • 问题1:程序计数器为什么要线程私有?
    为了线程切换后能够恢复正确的执行位置,每条线程都需要一个独立的程序计数器。
  • 问题1:线程正在执行一个Java方法和Native方法,程序计数器存储有何不同?*

Java方法存储的是字节码指令的地址,Native方法,计数器为空(Undefined)

二、Java虚拟机栈(Java Virtual Machine Stackes)线程私有
  生命周期与线程相同。
  内存空间在编译期间完成分配。
  存储局部变量表、操作数栈、动态链接、方法出口等信息。
  每一个方法从调用直到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程。
  • 问题1,局部变量表包含哪些类型?

基本数据类型(boolean、byte、char、short、int、float、long(2个空间)、double(2个空间)),对象引用(reference类型)、returnAddress类型

  • 什么是栈溢出(StackOverFlow)

如果线程请求的深度大于虚拟机栈所允许的深度。另,虚拟机栈可动态扩展,扩展申请不到内存,则OOM。

三、本地方法栈(Native Method Stack)线程私有
与虚拟机栈类似,也会出发StackOverFlow以及OOM
四、Java堆(GC堆、垃圾堆,哈哈哈哈) 线程共享
 虚拟机启动时候创建
 对象实在分配内存区域。
Java虚拟机运行时数据区_第2张图片
分为老年代,新生代(Eden,From Survivor(S2),To Sruvivor(S1))。
  • 虚拟机堆区参数设置

Java虚拟机运行时数据区_第3张图片

  -Xms:设置堆的最小空间大小。

-Xmx:设置堆的最大空间大小。

-XX:NewSize设置新生代最小空间大小。

-XX:MaxNewSize设置新生代最大空间大小。

-XX:PermSize设置永久代最小空间大小。

-XX:MaxPermSize设置永久代最大空间大小。

-Xss:设置每个线程的堆栈大小。
   堆区无法在扩展时候抛出OOM
  • 问题1,什么是时候出触发Minor GC?
  • 问题2,什么时候触发Full GC?
五、方法区(Non-Heap) 线程共享
 别名永久代
 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
 运行时常量池也存放其中,比如String的intern()方法。
 也会触发OOM。

-XX:MaxPermSize //设置方法区大小

六、直接内存(Direct Memory)

Java虚拟机规范外的内存,NIO就是利用Native函数库分配堆外内内存。
涉及本机总内存问题,牵扯OOM。

参考《深入理解Java虚拟机:JVM高级特性与最佳实战》
https://www.cnblogs.com/xcmel...

你可能感兴趣的:(java)