虚拟机栈
1、虚拟机栈维护一个线程中所有方法的栈帧,每个栈帧中保存着这个方法中用到的局部变量表,操作数栈,常量引用
2、可以用-Xss来设置每个线程中虚拟机栈的大小,在jdk1.4之前默认虚拟机栈大小是256K,在jdk1.5+默认虚拟机栈大小是1M
java -Xss2M HackTheJava
3、该区域可能抛出的异常
- 当线程请求的栈深度超过最大限制后,或抛出StackOverflowError
- 当栈进行动态扩展无法申请到内存后,会抛出OutOfMemoryError
本地方法栈
本地方法栈和虚拟机栈类似,区别在于这里栈帧对应的是本地方法
本地方法一般是用其他语言编写的(C,C++或者汇编)
程序计数器
指示线程的行数计数器
堆
1、线程中所有的实例对象都被分配在这里,虚拟机的垃圾回收主要也是回收这块内存区域,所以这里也被称为GC堆
java的垃圾回收一般都是按照分代收集算法,堆中又划分有新生代和老年代
2、堆中的内存可以不是连续的,可以动态扩展内存,当扩展不到的时候会抛出OutOfMemeoryError
3、可以用-Xms和-Xmx来设置堆的大小,前一个参数设置初始大小,后一个参数设置最大大小
java -Xms1M -Xmx2M HackTheJava
方法区
1、方法区用来保存加载的类信息,静态变量,常量,即时编译器编译后的代码等信息
2、这块区域和堆一样不需要连续的内存,可以动态扩展内存,当扩展不到的时候会抛出OutOfMemeoryError
3、对这块区域的回收主要是对常量池的回收和类的卸载,不过一般很难实现,这块区域又被称为“永久代”
4、jdk1.8之后移除永久代,而将方法区移到元空间,这是虚拟机外部的内存空间
4、方法区是一个java虚拟机规范,其实现形式有元空间和永久代,jdk1.8之后,原来永久代的数据被分到元空间和堆中,类的信息分到元空间中,静态变量和常量分到堆中
直接内存
在jdk1.4的时候引入NIO类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。
这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。
原文地址:https://www.cnblogs.com/huanglf714/p/11027175.html