jvm原理——java运行时数据区域总结

学JVM的好处:

    JVM是Java运行的虚拟机,java文件的编译运行都经过JVM,所以要想写出高效的java程序,对JVM的了解是必须的。只有了解了java实际运行的过程和原理,才能进行最大的优化。而Java程序在运行时一方面要注意安全性,一方面是运行效率,这是程序索要考虑的最大的两个因素。下面来介绍一下Java程序运行时的内存划分以及数据区域相应的概念总结,对于运行时数据区域的详细解读将在后续博客中继续更新。

很多程序员习惯于把Java运行时数据区域分成栈内存和堆内存,这种分法是很粗糙。下面介绍一下较详细数据区域划分:

Java运行时数据区域主要有:

    1.程序计数器

    2.Java虚拟机栈

    3.本地方法栈

    4.Java堆

    5.方法区

    6.运行时常量池

    (7.直接内存)

1.程序计数器:

    程序员计数器是Java运行时数据分区的一块较小的内存空间,主要用来存储当前程序所执行的字节码的行号,可以看成他是程序执行的行号指示器。java程序在执行时都是通过行号作为索引去寻找下一条要执行的命令语句。例如循环,分支等都是这种机制。

2.Java虚拟机栈:

    虚拟机栈是Java方法执行的内存模型,他服务于Java方法。虚拟机栈中存储方法运行时的局部变量表、操作数栈、动态链接以及方法出口等信息。其中,局部变量存储了编译期可知的各种基本数据类型(例如int、char等)、引用类型(reference类型,不同于对象本身,可能是指向对象的起始地址的引用指针,也可能是指向一个对象代表的句柄或其他此对象相关位置)和returnAddress类型(指向一条字节码指令的地址)。

    方法运行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接以及方法出口等信息,每一个方法从被调用到执行结束都对应着上述存储的东西从入栈到出栈的过程。

    Java虚拟机栈是线程的私有内存,就是每个线程执行时都会创建属于自己的内存空间。

    注意:在虚拟机栈中,64位的long类型和double类型是占用两个局部变量空间,其他的类型占用一个局部变量空间。

虚拟机栈主要有两个异常:

    StackOverflowError异常:请求深度大于虚拟机所允许的深度

    OutOfMemoryError异常:虚拟机栈动态扩展时,申请不到足够的内存抛出的异常

3.本地方法栈:

    本地方法栈与Java虚拟机栈作用相似,只是他们的服务对象不同,本地方法栈是服务于Native方法的,与虚拟机栈不同的还有一点,就是虚拟机规范中并没有规定本地方法栈中使用的语言、使用方式和数据结构。用户可以自由实现它。甚至有的虚拟机再设计时将本地方法栈和虚拟机栈合二为一。

    Native方法,Java中的Native是一个关键字,方法用Native关键字修饰,叫做Native方法。因为Java无法直接操作系统底层,包括一些硬件,所以Java提供了Native方法来调用其他语言来实现访问系统底层,具体用法可以百度一下,很容易找到。

异常:与虚拟机栈中的异常相同

4.Java堆:

    是虚拟机所管理的最大的一块内存,Java堆被所有线程共享,在虚拟机启动时被创建。

    堆用来存储对象实例,这是该部分内存的唯一目的。但是随着技术的发展,现在已经不这么绝对了。但是大多数还是这样的。

    Java堆是垃圾回收器管理的主要区域,也被叫做GC堆。

    Java堆分为新生代和老年代,主要是因为收集器采用分代回收算法。其实还可以细分为Eden空间、From Survivor空间和To Survivor空间等。

    虽然Java堆是线程共享的,但是每个线程启动时都会在Java堆中开辟一块属于自己的内存,来存储自己运行时的实例对象,这样划分主要是可以提高内存分配速度和内存回收效果。

5.方法区:

    跟Java堆一样是多线程共享。

    方法区是Java堆的一个逻辑不部分,但是方法区又被称为Non-Heap(非堆),应该是为了和Java堆区分出来。

    这部分区域用于存储类信息、常量、静态常量、及时编译器编译后的代码等数据。

    虚拟机的规范给方法区的限制非常宽松。不需要连续的空间,可以选择不实现垃圾回收,注意:这里的垃圾回收主要是针对常量池的回收和对类型的卸载。

6.运行时常量池

    是方法区的一部分

    主要存储类的常量,再类加载后进入运行时常量池存放。

    运行时常量池区别于class文件的常量池,运行时常量池具有动态性,除了class文件中的常量可以进入运行时常量池以外,运行期间也可以将新的常量加入到运行时常量池。例如String类的intern()方法。

    Java虚拟机规范并没有对运行时常量池做任何细节的要求,不同的虚拟机提供厂商可以根据自己的需要实现这一部分区域。

7.直接内存:类似于本机的内存,他不是虚拟机管理的范围,所以不做介绍了。

    

    

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值