获取jvm运行时内存状况

    public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println("Max:"+Runtime.getRuntime().maxMemory());

System.out.println("Free:"+Runtime.getRuntime().freeMemory());

System.out.println("Total:"+Runtime.getRuntime().totalMemory());

}
### JVM 运行内存区域划分及作用 JVM(Java 虚拟机)的运行数据区是 Java 程序执行过程中用于管理内存的核心结构,根据《Java 虚拟机规范》,JVM内存划分为多个不同的区域,这些区域在程序运行期间承担着不同的职责。 #### 3.1 线程私有区域 ##### 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。它记录的是当前线程正在执行的字节码指令地址(如果是 Native 方法,则为空)。该区域是唯一一个在《Java 虚拟机规范》中没有规定 OutOfMemoryError 的区域[^4]。 ##### Java 虚拟机栈(Java Virtual Machine Stack) Java 虚拟机栈描述了 Java 方法执行的内存模型:每个方法在执行的同会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到执行完成的过程,就对应着栈帧的入栈和出栈过程。该区域可能会抛出 StackOverflowError 和 OutOfMemoryError 异常[^4]。 ##### 本地方法栈(Native Method Stack) 本地方法栈与虚拟机栈类似,区别在于它服务于 Native 方法(C/C++ 实现的方法)。该区域也可能抛出 StackOverflowError 和 OutOfMemoryError 异常,并且通常与虚拟机栈合并管理[^3]。 #### 3.2 线程共享区域 ##### Java 堆(Java Heap) Java 堆是所有线程共享的一块内存区域,用于存放对象实例和数组。它是垃圾收集器的主要工作区域,也是最容易发生内存溢出(OutOfMemoryError: Java heap space)的地方。可以通过 `-Xms` 和 `-Xmx` 参数来设置堆的初始大小和最大值。 ##### 方法区(Method Area) 方法区同样是线程共享的内存区域,用于存储被虚拟机加载的类信息、常量池、静态变量以及即编译器编译后的代码等数据。在 Java 8 及以后版本中,方法区被元空间(Metaspace)替代,元空间使用的是本地内存而非堆内存。可以通过 `-XX:MetaspaceSize` 和 `-XX:MaxMetaspaceSize` 来配置其大小。当无法满足内存分配需求,将抛出 OutOfMemoryError 异常[^2]。 #### 3.3 直接内存(Direct Memory) 直接内存并非虚拟机运行数据区的一部分,也非《Java 虚拟机规范》定义的内存区域,但它在 NIO(New Input/Output)等场景下被频繁使用。由于直接内存不受 JVM内存限制,因此可能导致 OutOfMemoryError 异常。可以通过 `-XX:MaxDirectMemorySize` 参数来限制其大小[^1]。 #### 3.4 内存区域总结对比表 | 区域名称 | 线程共享性 | 存储内容 | 内存溢出类型 | 配置参数示例 | |---------------------|------------|------------------------------------------|--------------------------------------|-----------------------------------| | 程序计数器 | 私有 | 当前线程执行的字节码行号 | 无 | 无 | | Java 虚拟机栈 | 私有 | 局部变量表、操作数栈、动态链接、方法出口 | StackOverflowError, OutOfMemoryError | -Xss | | 本地方法栈 | 私有 | Native 方法的栈帧 | StackOverflowError, OutOfMemoryError | 同虚拟机栈 | | Java 堆 | 共享 | 对象实例、数组 | OutOfMemoryError: Java heap space | -Xms, -Xmx | | 方法区(元空间) | 共享 | 类信息、常量、静态变量 | OutOfMemoryError: Metaspace | -XX:MetaspaceSize, -XX:MaxMetaspaceSize | | 直接内存(Direct Memory) | 共享 | NIO 缓冲区等 | OutOfMemoryError | -XX:MaxDirectMemorySize | #### 3.5 示例代码:查看 JVM 内存配置 ```java import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; public class JVMMemoryInfo { public static void main(String[] args) { MemoryMXBean memoryMxBean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapMemoryUsage = memoryMxBean.getHeapMemoryUsage(); System.out.println("Heap Memory Usage: " + heapMemoryUsage); MemoryUsage nonHeapMemoryUsage = memoryMxBean.getNonHeapMemoryUsage(); System.out.println("Non-Heap Memory Usage: " + nonHeapMemoryUsage); } } ``` 上述代码展示了如何通过 Java 的 `ManagementFactory` 获取 JVM 的堆内存和非堆内存使用情况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值