Jvm内存
1.堆内存(Heap):
堆内存是Java中用于存放对象实例的内存区域,几乎所有的对象实例(包括数组)都在这里分配内存。
堆内存由垃圾回收器(Garbage Collector,GC)自动管理,程序员不需要手动释放。
堆内存可以细分为年轻代(Young Generation)、老年代(Old Generation)和永久代(PermGen,在Java 8及以后版本中改为元空间Metaspace)等,但这种划分主要基于垃圾回收的考虑,并非Java内存结构的直接组成部分。
2.栈内存(Stack):
栈内存主要用于存储局部变量和方法调用的上下文信息(如方法的参数、返回地址等)。
每个线程都有自己的栈内存,栈内存中的数据以栈帧(Stack Frame)的形式存在,每个栈帧对应一个方法调用的执行上下文。
当方法被调用时,会创建一个新的栈帧并将其压入调用线程的栈中;当方法执行完毕时,对应的栈帧会被弹出并销毁。
3.方法区(Method Area):
方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
在Java 8及以前版本中,方法区也被称为永久代(PermGen),但由于永久代的内存分配方式不够灵活,且容易导致内存溢出,因此在Java 8中被元空间(Metaspace)所取代。
4.本地方法栈(Native Method Stack):
本地方法栈与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
5.程序计数器(Program Counter Register):
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
6.直接内存(Direct Memory):
直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。
Java NIO引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
jps(Java Process Status):查看正在运行的Java进程