运行时数据区
线程中的栈结构和JVM的堆结构
虚拟机栈
Java的指令是基于栈的架构,栈是运行时单位,而堆是存储单位
作用: 主管JAVA程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回。
JVM对栈的操作只有出栈和压栈。且允许Java栈的大小是动态的或是固定不变的。
设置栈大小命令:-Xss
栈可能的异常
- StackOverFlowError:
当固定栈的容量时,线程请求分配的栈容量超过Java虚拟机栈允许的最大容量。 - OutofMemoryError:
虚拟机的栈容量是可变时,尝试扩展内存但无法申请额外内存。
栈内部的存储单位
每个线程都有自己的栈,栈中的数据都是以栈帧的形式存在。在线程上执行的每个方法都对应着一个栈帧
栈运行原理
1. 不同线程中所包含的栈帧是不允许存在相互引用的,即不能在一个栈帧中引用另一个线程的栈帧。
2. Java方法有两种返回方式:一种是正常的return 返回,一种是抛出异常。这两种都会导致方法栈帧被弹出
JVM 系统线程
主要的后台系统线程在Hotspot JVM 里主要是以下几个:
虚拟机线程:这种线程的操作需要JVM达到安全点才出现,这些操作必须在不同线程中发生的原因是他们都需要JVM达到安全点,这样堆才不会变化。这种线程的执行类型包括“stop-the-world”的垃圾收集、线程栈收集、线程挂起以及偏向锁撤销。
周期任务线程:这种线程是周期事件的体现(比如中断),他们一般用于周期性操作的调度执行。
GC线程:这种线程对在JVM里不同种类的垃圾收集行为提供支持。
编译线程:在运行时会将字节码编译成本地代码。
信号调度线程:这种线程接收信号并发给JVM,在它内部通过调用适当方法进行处理。
JVM中的Runtime类(运行时环境)
每个JVM只有一个Runtime实例,即为运行时环境。线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行。
RunTime类常用的方法:
- getRuntime():该方法用于返回当前应用程序的运行环境对象。
- exec(String command):该方法用于根据指定的路径执行对应的可执行文件。
- freeMemory():该方法用于返回Java虚拟机中的空闲内存量,以字节为单位。
- maxMemory():该方法用于返回Java虚拟机试图使用的最大内存量。
- totalMemory():该方法用于返回Java虚拟机中的内存总量。
- availableProcessors()方法 返回Java虚拟机可用的处理器数