带你走进JAVA世界系列 之 JVM

今天突然想整理总结下JAVA基础的东西,因为各个大厂面试都需要对基础很了解。我开启一个带你走进JAVA世界系列。好,闲话少说,开始讲下JVM的原理。

说到JVM需要了解其运行时的数据区,看下图

   

程序计数器:当前线程执行的字节码的行号指示器,用C语言就是指针。每条线程都有一个独立的程序计数器,各条线程之间相互  不影响。如果执行java方法,PC就是执行虚拟机字节码指令的地址。如果执行本地方法,则值为空。

虚拟机栈:线程私有,生命周期与线程相同,执行java方法(字节码)的服务,每个方法执行过程中都会创建一个栈帧,用于存放局部变量表、操作数栈、动态连接等信息。目前就可以理解为局部变量表的存放空间。局部变量表存放的是8大基础数据类型和对象引用,编译时期就可以完成分配,因为每个数据类型长度都是确定的,所以进入一个方法的时候,这些都是可以确定的。

本地方法栈:jvm使用到的本地方法服务,本地方法大部分都是C和C++来实现的。比如Cglib代理的字节码服务实现等。

堆:被所有线程共享的一块区域。此区域唯一目的就是存放对象实例。虽然说所有的对象实例以及数组都要在堆上分配,但是技术革新太快也不是太绝对,不过我们还是可以先这样理解。同时这里也是垃圾回收管理的主要区域。可以用-Xms(初始java堆大小),-Xmx(最大java堆大小)。垃圾回收我们下章在细聊。一定要注意哦:java堆在物理上面不一定是连续的哦。

方法区:被所有线程共享的区域。用于存储:class信息、常量(final)、静态变量(static)、即时器编译后的代码等数据。永久代其实并不等价于方法区,只是用永久代来实现方法区而已。这块区域的内存回收目标主要是针对常量池的回收和对类型的卸载。常量池是方法区中的一部分。用于存放编译期生成的各种字面量和符号引用。

主要搞懂这些以后,基本面试就没啥问题了。

我在说说对象的访问定位吧,对象访问定位分为:句柄访问、直接指针访问两种方式。

1、句柄方式

2、直接指针访问

对比发现句柄访问好处是引用中存放句柄地址,对象移动只会改变句柄中指针的指向,reference不用变动。

指针直接指向的好处就是省略一次指针定位开销。

 

等下一章给大家说说并发操作如何操作java内存的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值