深入理解JVM--读书笔记

由于只是初步了解,所以了解的程度不会很深入。
第一章,作者在出版第一版之后,因为有读者反映忽略了JDK本身源码的分析,所以有了第二版的第一章,由于能力有限,这里对于第一章不做赘述,下面描述的虚拟机是HotSpot。
Java各个版本主要更新内容
1.1版本 Java虚拟机,applet,AWT
1.2版本 EJB,Java plug-in,JavaIDL,Swing
1.3版本 JNDI ,数学运算,Timer
1.4版本 正则表达式,异常链,NIO(new Input/Output),日志类,XML解析,XSTL转换器
1.5版本 自动装箱,泛型,动态注解,枚举,可变长参数,foreach,java.util.Concurrent并发包
1.6版本 动态语言支持,编译API,锁与同步,垃圾收集,类加载的算法改进
1.7lambda表达式,函数式编程
程序计数器
在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支循环,跳转,异常处理,线程恢复,都需要依赖这个计数器来完成。
Java虚拟机栈
VM Stack 每个方法执行时都会创建一个帧栈,每个方法调用直至执行完成的过程,就对应着一个帧栈在虚拟机栈从入栈到出栈的过程,我们口中常说的“栈内存”就是虚拟机栈的局部变量表部分。
64位的计算机,long、double 占用两个局部变量的单位空间。
局部变量表所需内存空间在编译期间完成分配,当进入一个方法之中,这个方法需要在帧中需要多大的局部变量是完全确定的。在方法运行期间不会改变局部变量表的大小。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出OutOfMemoryError异常。
如果虚拟机可以动态扩展,但扩展时无法申请到足够内存,将抛出OutOfMemoryError。
Java Heap(堆)
Heap是被所有线程共享的一块较大区域,在虚拟机启动时创建,几乎所有的对象实例与数组都要在堆上分配。
Java Heap是垃圾回收器管理的主要区域。
Method Area(方法区)
各个线程共享,用于存储已被虚拟机加载的类信息常量,静态变量,即时编译器,编译后的代码等数据,别名Non-Heap。
运行时常量池(Runtime Constant Pool) class除了有类的版本字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字符和符号引用,这部分内容将在类加载后进入方法区的运行常量池中存放。
1.4版本发布:NIO(new Input/Output),基于通道(Channel —用于复制,效率较高)与缓冲(Buffer),Thread Local Allocation Buffer(TLAB –本地线程分配缓冲)
HotSpot虚拟机之中,对象在内存之中存储的布局可以分为三大区域。
1,对象头(Header)
HotSpot对象头包括两部分,第一部分用于存储对象自身运行的数据,如哈希码(HashCode),GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等。官方称为”Mark Word”。
另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针确定这个对象是哪个类的实例,并不是所有的虚拟机实现都必须在对象数据上保留类型指针,但是查找对象元数据的指针不一定需要经过对象本身。
HotSpot 分配策略:longs,doubles,ints,shorts/chars,bytes/booleans,oops(Ordinary Object Pointers)在父类之中定义的变量会出现在子类前。
第三部分,对齐填充,并不是必然存在的,只起占位符作用,由于HotSpot VM的自动管理系统要求起始地址必须是8字节的整数倍。
对象的访问定位
1,句柄访问:堆中划分句柄池,reference (引用)存储句柄地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息。
2,直接指针:Java堆对象就必须考虑如何放置访问类型数据的相关信息,reference存储的是对象地址。
reference 存储的是对象地址,直接指针速度快,sun HotSpot用的直接指针
Out Of Memory Error异常处理方法
1,Java堆溢出,对象过多,OOM()
判断是内存泄漏,还是内存溢出Memory Overflow
2,虚拟机栈和本地方法栈溢出,HotSpot不区分虚拟机栈与本地方法栈溢出。
3,方法区和常量池溢出
String.intern()是个Native方法,作用是如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回池中这个字符串的String对象,否则,将此String对象包含的字符串添加到常量池中,并且返回String对象的引用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值