jvm原理学习笔记

一,运行时数据区域

见图java 虚拟机运行时数据区.png

 

二. 程序计数器

线程私有,当执行java方法时,程序计数器的值是虚拟机字节码指令的地址,当执行本地方法时值为空。

注意:java的多线程是通过轮流切换并分配cpu处理时间实现。谁来控制切换,谁来分配cpu时间?

 

三. java虚拟机栈

线程私有,生命周期与线程相同。

是秒描述java方法执行的内存模型。

每个方法执行时都会创建一个栈帧,用于保存方法的局部变量表(编译期即已确定内存大小,运行期不会改变这个大小),参数栈,动态连接(是什么,有什么作用?),方法出口等信息。一个方法从进入到执行完成就对应着这个方法的栈帧入栈和出栈的过程。

 

四. 本地方法栈、

与虚拟机栈类似,区别在于虚拟机栈是为虚拟机执行java方法(字节码)服务,本地方法栈是为java调用本地方法服务。

 

五. 堆

java堆的目的是为了存放实例对象。

以内存回收的角度看(垃圾回收器一般是使用分区算法),堆可以分为:新生代和老年代,再细分就是eden区,from survivor区, to survivor区, 老年区等。

以内存分配的角度看,有线程共享的内存和线程私有的缓冲区(Threads Local  Allocation Buffer)。

 

 

六. 方法区

线程共享,用于存储类信息,常量,静态变量,即时编译器编译成的代码等信息。在hotspot虚拟机中目前是使用 “永久代”来实现方法区,但是这部分区域同样需要内存回收(主要针对常量池和类型卸载),只是条件更苛刻。

 

 

七. 运行时常量区

String a = "a";
String b = "a";
System.out.println(b == a);

结果是true

 

String a = new String("a");
String b = new String("a");

System.out.println(b == a);

结果是false

 

八. 直接内容

非虚拟机运行时数据区,对外内存。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值