l Java虚拟机内存区域分配及管理
如题,最近正在看虚拟机方面的书,记点笔记。
区域名 |
存储内容 |
生命周期 |
说明 |
可能产生的异常类型 |
程序计数器 |
字节码执行的行序号 |
线程私有 |
虚拟机根据程序计数器来选取下一条需要执行的字节码指令。若执行本地方法,则值为空 |
唯一一个没有规定异常产生的区域 |
方法区 |
虚拟机已加载的类信息、常量、静态变量、即时编译器编译过的代码 |
线程共享 |
区别于java堆,有一个别名叫Non-Heap(非堆) |
方法区无法满足内存分配需求时抛出 OutOfMemoryError |
JVM栈 |
Java方法运行时的局部变量表、操作栈、动态链接、方法出口等 |
线程私有 |
Java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧,存储局部变量表、操作栈、动态链接、方法出口等,方法执行过程就是对应的栈帧入栈到出栈。 |
栈溢出StackOverflowError 内存溢出 OutOfMemoryError |
本地方法栈 |
本地方法的局部变量表、操作栈、动态链接、方法出口等 |
线程私有 |
与java栈作用相似,区别是执行的方法是本地方法(Native Method)而不是java方法 |
栈溢出StackOverflowError 内存溢出 OutOfMemoryError |
堆 |
对象实例(几乎完全是) |
线程共享,虚拟机启动时创建 |
逻辑连续,物理可不连续 |
内存溢出 OutOfMemoryError |
运行时常量池 |
Class文件中常量池部分的编译期生成的各种字面量和符号引用,翻译出来的直接引用,类加载后放在运行时常量池中 |
方法区的一部分 |
也可以存储运行期间产生的新的常量,典型应用String类的intern()方法 |
内存溢出 OutOfMemoryError |
直接内存 |
|
|
常规内存,java虚拟机外的一块频繁使用的内存区域,使用Native方法进行内存分配,然后通过一个存储在java堆里的对象来引用这块内存 |
内存溢出 OutOfMemoryError |
原文:http://www.cnblogs.com/JavatechBlog/p/3549437.html