乐趣区

关于java:Java虚拟机运行时数据区

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…

退出移动版