了解java虚拟器内存机制的好处
当我们需要解决一些棘手的问题,比如性能优化,解决OOM异常时,如果我们了解java虚拟机的内存机制,就知道从哪里下手处理这些问题了
如何了解
我从三方面去说明他
进程级别
我们在pc上做一个应用,在手机上做一个app,都是以进程的级别存在的。在进程这个级别中,内存被分配给/分配为 java堆、方法区(含有常量存储区)、各个线程
- java堆:java堆是GC线程回收内存的区域,他主要是用来存储各种对象
- 方法区:方法区存储了class在加载之后的信息,如全局变量,方法等
- 常量存储区:静态变量存储区是包含在方法区之中的,他用来存放各种static final常量,这个内存区是可变的
在这些内存区内都会有可能出现OOM异常的
线程级别
- 程序计数器:每一个线程都会有一个程序计数器,这个在debug的时候跟踪走到哪一步。程序计数器使用的内存很少,而且这部分是不会产生OOM异常的!
- java虚拟机栈:顾名思义,java虚拟机栈是以栈的方式存在的,所以他的访问速度要比堆快的多。java虚拟机栈存储的是本地变量,java的基本数据类型,对象类型/array类型存储的是指向java堆的地址
- native方法栈:native方法栈对应java虚拟机栈存储的是native方法的内容
栈和堆不同之处,栈是会抛出stackOverflowException的,不过也有可能会抛出OOM,但是在实战中,stack的内存超出了内存限制,一般抛出的都是stackOverflowException
其他
- 直接内存:直接内存是在NIO时会用到,他是为了避免native堆和本地堆来回copy数据,而实现的技术
以上内容,如有错误,请大神们指正