JVM学习笔记

来源:互联网 发布:c语言输出整数 编辑:程序博客网 时间:2024/06/10 10:13

JDK和JRE的区别

JDK是开发库,而JRE只是运行环境。JRE没有编译器,也没有JAVA API里面非JAVASE API的部分等。eclipse之所以用jre也能运行,是因为IDE内部集成了编译器。

运行时数据区域

程序计数器(program counter register)

存储字节码指令的地址。如果是java方法,则记录对应的地址,如果是native方法,则为undefined。关于字节码指令:http://blog.csdn.net/chenzhp/article/details/1798166

java虚拟机栈(java virtual macheine Stacks)

其存储如下数据:

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法返回地址

该栈中常见的两种错误:

  • StackOverflowError 栈太大。比如线程里面声明太多对象等。
  • OutOfmemoryError JVM内存不足。比如线程太多。

本地方法栈(Native Method Stacks)

java虚拟机栈为java方法服务,本地方法栈为native方法服务。

java堆(Java Heap)

放实例和数组,可分为新生代和老年代

方法区(Method Area)

其存储如下数据:

  • 类型的常量池:关联的所有类型,域,方法以及符号引用
  • 域信息:修饰符、域名、与类型、声明顺序等
  • 方法信息: 方法名、返回信息、参数类型、个数等。
  • 类静态成员变量
  • 对类加载器的引用。声明类采用了哪一个类加载器。只有类加载器一致时才能判定两个类的类型一致
  • Class实例的引用。Class.forName()就是以此实现。

运行时常量池(Runtime Constant Pool)

运行时常量池是把Class文件常量池加载进来。存储各种常量。一开始是符号引用,使用到的时候会替换成直接引用。运行期间也可动态更新。可以认为其是class文件常量池的一个动态扩充池。经典的例子String.intern()
参考资料:http://hllvm.group.iteye.com/group/topic/40008,
参考资料:http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html

直接内存(Direct Memory)

使用native方法时候直接分配的堆外内存。不受jvm控制。但受机器内存限制。

指针和引用的区别

对象引用的实现方式会根据虚拟机的不同有不同实现,一般是指针或者句柄,指针直接指向物理内存地址,句柄则是一种指向指针的指针。因为windows操作系统的对象物理地址经常变化。所以通过句柄这种32位的索引来唯一标识一个windows自身的管理的资源。(窗口或文件,文件包括了本地io和网络io/socket等。)

0 0
原创粉丝点击