关于 JVM 简单理解

来源:互联网 发布:surge for mac 破解 编辑:程序博客网 时间:2024/06/14 05:09

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本身不用修改。

0 0
原创粉丝点击