运行时数据区包含以下几个方面:
1、程序计数器
每个线程都有一个独立的程序技术器记录该线程执行到的字节码位置。是线程私有的
2、java虚拟机栈
线程私有,生命周期与线程相同。每个方法执行时都会生成一个栈帧,用于存储局部变量表,操作栈、动态链接,方法出口等信息。
3、本地方法栈
和java虚拟机栈作用相似,只不过是为虚拟机使用到的本地方法服务。
4、java堆
所有线程所共享的一块区域。几乎所有的对象都在这里分配内存。java堆时垃圾收集器管理的主要区域。java堆可以处与物理上不连续的内存区域,只要逻辑上是连续的即可。
5、方法区
各个线程所共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6、运行时常量池
方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期所生成的一些字面量和符号引用。这部分内容将在类加载后存放在方法区的运行时常量池中。
7、直接内存
各种内存溢出
1、堆内存溢出
调节-Xmx -Xms大小 :-Xms400m -Xmx1000m
分析出是内存溢出还是内存泄露
通过eclipse memory analyzer分析内存溢出
2、虚拟机栈和本地方法栈溢出
-Xoss 设置本地方法栈大小 (对HotSpot无效)
栈容量通过 -Xss 设定
线程请求的深度大于虚拟机所允许的最大深度 (如无限的递归调用)
虚拟机在扩展栈时无法得到足够的内存空间
3、运行时常量池
通过 -XX:PermSize 和 -XX:MaxPermSize限制其大小。
4、方法区溢出
5、本机直接内存溢出