`
Surlymo
  • 浏览: 95654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM学习笔记(一)

阅读更多

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

2、运行时数据区域
(1)程序计数器(program counter register)
    存储字节码指令的地址。如果是java方法,则记录对应的地址,如果是native方法,则为undefined。关于字节码指令:http://blog.csdn.net/chenzhp/article/details/1798166
(2)java虚拟机栈(java virtual macheine Stacks)

    其存储如下数据:

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

    2)基本数据类型

    3)returnAddress(指向一条字节码指令的地址)

    另外地,从栈本身的机构来看,栈可以被划分为:操作数区、局部变量区以及帧数据区:
    1)操作数区:比如a+b的这个操作就是需要依次将a和b放入该区计算
    2)局部变量区:存储a和b以及a+b计算后的值得区域
    3)帧数据区:支持方法区的常量池的解析、正常方法的返回以及异常派发机制。
    参考资料:http://blog.163.com/sejin%40126/blog/static/82750455201091271810757/

    该栈中常见的两种错误:
    1)StackOverflowError 栈太大。比如线程里面声明太多对象等。
    2)OutOfmemoryError  JVM内存不足。比如线程太多。
(3)本地方法栈(Native Method Stacks)
    java虚拟机栈为java方法服务,本地方法栈为native方法服务。
(4)java堆(Java Heap)
    放实例和数组,可分为新生代和老年代
(5)方法区(Method Area)
    1)类型的常量池:关联的所有类型,域,方法以及符号引用
    2)域信息:修饰符、域名、与类型、声明顺序等
    3)方法信息: 方法名、返回信息、参数类型、个数等。
    4)类静态成员变量
    5)对类加载器的引用。声明类采用了哪一个类加载器。只有类加载器一致时才能判定两个类的类型一致
    6)Class实例的引用。Class.forName()就是以此实现。
    参考例子:http://shenlvcheng.iteye.com/blog/864940
(6)运行时常量池(Runtime Constant Pool)
    运行时常量池是把Class文件常量池加载进来。存储各种常量。一开始是符号引用,使用到的时候会替换成直接引用。运行期间也可动态更新。可以认为其是class文件常量池的一个动态扩充池。经典的例子String.intern();基础类型的局部常量放在栈中。而局部方法里面声明的String类型的值,也是放在方法区运行时常量池里面的。

    参考资料:http://hllvm.group.iteye.com/group/topic/40008,
    参考资料:http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html
(7)直接内存(Direct Memory)
    使用native方法时候直接分配的堆外内存。不受jvm控制。但受机器内存限制。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics