1.虚拟机分配的运行时数据区
(图源深入理解java虚拟机 以下同上)
其中方法区域:线程共享,存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等等。(HotSpot虚拟机上开发部署人员更愿意成为“永久代”,Permanent Generation)。2.对象访问的两种方式
使用句柄和直接指针
3.堆溢出
对象不能被回收
4.虚拟机栈和本地方法栈溢出
HotSpot不区分这两个区域
有两种可能:
1.线程请求栈深度大于虚拟机所允许的最大深度 StackOverflowError
2.虚拟机在扩展栈时无法申请到足够的内存空间 OutofMemoryError
单线程深度一般来说可以达到要求 建立过多线程有可能导致内存溢出
5.运行时常量池溢出
String.intern()方法 如果常量池中有一个等于此String对象的字符串 则返回代表池中这个字符串的String对象;否则将此String对象包含的字符串添加到常量池中,并且返回此String的引用 (常量池分配在方法区内)
6.方法区溢出
方法区用于存放Class的相关信息 如类名,访问修饰符,常量池,字段描述,方法描述等