您的位置:首页 > 编程语言 > Java开发

关于 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本身不用修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm 虚拟机 java