《深入理解Java虚拟机》笔记(1)


jdk1.5 加入concurrent粗粒度的并发框架,在jdk1.7又加入了concurrent.forkjoin
程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码信号指示器,字节码工作时就是通过这个
计数器的值来选取下一条需要执行的字节码指令。如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native的方法,这个值就是空。
Java虚拟机栈:也是线程私有的,生命周期和线程相同。每个方法在执行的时候都会床架一个栈帧,用于储存局部变量表,动态连接等,一个方法从调用到执行完毕的过程就是一个栈帧出入的过程。
在Java的虚拟机规范中,对这个区域的异常情况:请求的栈的深度大雨虚拟机允许的深度,会 StackOverFlowError
虚拟机栈可以支持动态扩展,如果无法申请到足够的内存,就会 OutMemoryError异常
本地方法栈的功能和虚拟机栈类似,只不过本地方法栈为虚拟机使用的native方法服务。
Java堆:是用来存放对象实例,几乎所有的对象实例都会在这里分配内存。 Java堆是垃圾回收器主要管理的区域,也被称为GC堆,
从内存回收的角度看,现在的收集器基本采用分代收集算法 所以 Java堆分为新生代和老年代。
方法区:与Java堆一样是各个线程共享的内存区域,用来储存虚拟机加载的类信息,常量,静态变量。。很对人把方法区称为永久代。
是因为hotSpot把GC分发收集扩展到方法区上,这样hotspot的垃圾回收器就可以像管理堆内存一样来管理方法区的内存,就不用单独实现来管理方法区上的内存, 这样并不是个好主意,更容易出现内存溢出。
方法区中的内存回收主要是针对常量池的回收和对类型的卸载。
运行时的常量池:属于方法区的一部分。

在虚拟机中对象的创建:当虚拟机遇到new的指令的时候,首先去检查这个指令的参数是否在常量池中定为到一个类的符号,检测这个符号是否被加载解析和初始化过,如果没有就必须先执行类的加载过程。
在类的加载完成后,虚拟机会为新的对象分配内存。 内存分配如果Java堆中的内存是规整的那么,用过的内存放一边,空闲的放一边。中间放一个指针作为分界的指示器。指针挪一块相等的地方从闲到用就是分配了这叫做指针碰撞分配。
如果Java内存不是规整的,使用的和空闲的相互交错,那么虚拟机就必须维护一个列表,进行划分,叫做空闲列表。
对象创建分配内存的时候并不是线程安全的:解决方案:对分配内存空间的动作进行同步处理,实际上虚拟机采用的是CAS配上失败重试的方式保证操作额原子性。
对象的内存分布:早hotspot虚拟机中的布局分为三个区域:对象头 实际数据 和对齐填充

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值