关于 JVM 简单理解
2017-02-10 14:19
295 查看
JVM 笔记
最近在看《深入理解java虚拟机》 jvm高级特性与最佳实践,下面是一些简单的个人笔记和理解,如果有错欢迎指出。1.java运行时数据区域:
没错,图片是从网上找的。
其中:方法区和堆是所有线程共享的区域,而虚拟机栈,本地方法栈及程序计数器是线程隔离的。
下面是几个区域的名词解释:
1.程序计数器:
1.程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,程序计数器中不存储任何信息。 2.程序计数器是线程隔离的即每个线程都有自己的程序计数器,记录当前线程执行的位置,待下次轮换为当前线程时继续执行。 3.如果当前线程执行的是一个 java 方法,那么记录的是当前虚拟机正在执行的字节码指令的地址。 如果正在执行的是 Native 方法,计数器的值为空(Undefined)。 4.此区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
2.java 虚拟机栈:
可以粗糙的理解为:JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量 (java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame, 非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
3.【Native】本地方法栈:
本地方法栈与虚拟机栈发挥的的作用非常相似,区别在于: 1.虚拟机栈为虚拟机执行Java方法(字节码)提供服务。 2.本地方法栈为虚拟机使用到的Native方法服务。
4.堆:
1.java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 2.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 3.java堆是垃圾收集器管理的主要区域。 4.java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。
5.方法区:
1.方法区是各个线程共享的内存区域。 2.方法区用于存储所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。 3.在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
6.运行时常量池:
1.是方法区的一部分。 2.存放的为类加载后的字面量和符号引用信息。
2.对象的访问
主流的两种访问方式:1.使用句柄。
2.使用直接指针。
使用指针直接访问的方式最大的好处就是快,节省一次指针定位的时间开销,sun jdk使用该方式。
使用句柄访问的方式最大的好处就是reference中存储的是稳定的句柄地址,当对象移动时,只要改变句柄中的实例数据指针,而reference本身不用修改。
相关文章推荐
- 关于DataRow和DataColumn的一点个人简单理解
- 关于DataRow和DataColumn的一点个人简单理解
- 关于java中super与this的简单理解
- 关于STM32下载问题的简单理解
- 关于STM32下载问题的简单理解
- 最近做毕业设计发现市场上的Delphi书中关于TArrayField的一个错误理解,这里现简单的提一下以后有时间在好好的研究一下
- 关于Java的容器的简单理解
- 转载:Java中关于三目运算符理解和简单应用.
- 关于DataRow和DataColumn的一点个人简单理解
- 关于ASP.NET MVC中Form Authentication与Windows Authentication的简单理解
- 关于封装,继承,多态三个概念的简单理解
- 关于ROWID的简单理解和认识
- java中关于static的简单理解
- 关于java多线程的简单理解
- 关于fork()的理解——看上去简单
- 关于DataRow和DataColumn的一点个人简单理解
- 菜鸟发问,请各位不吝赐教啊! 关于一个简单的程序的理解问题
- 关于什么是BI的简单理解
- 关于linux设备驱动模型,今天做一个简单的理解总结,可能有错误,后面可能会更正
- 关于ASP.NET MVC中Form Authentication与Windows Authentication的简单理解