Jvm内存分为哪几个主要部分?
堆
主要用来存储实例对象,现今HotSpot虚拟机将该区做了分代分区处理,分为Eden,2个Supervisor,和Old
方法区
存储编译后产生的信息,如class,静态变量和常量等,也可以叫Non-heap,或者在HotSpot虚拟机中称为永久代
jvm栈
用来执行方法
本地方法栈
执行本地方法
PC计数器
有哪些原因会产生内存溢出?
Java Heap Space堆溢出
内存泄漏leak
查看GCRoots引用链,可能是有对象一直持有不该持有的引用导致未被正常回收
内存溢出overflow
如果不存在leak说明对象都是必须存在的,但是内存确实不够,想办法优化代码结构,或者增大Java堆内存大小
StackOverFlow栈溢出
方法调用深度过高,简称栈帧太大或者JVM栈太小
unable to create new native thread无法创建线程
每个线程都有独立的方法区和JVM栈区
当线程过多,这两个区的内存会很快被瓜分干净