java虚拟机运行时数据区

一、程序计数器(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堆、垃圾堆,哈哈哈哈) 线程共享
 虚拟机启动时候创立 对象切实分配内存区域。

分为老年代,新生代(Eden,From Survivor(S2),To Sruvivor(S1))。
  • 虚拟机堆区参数设置

  -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...