JVM-我的看书笔记

116 阅读2分钟

书籍,猿类进步的阶梯!!!
 
《深入理解java虚拟机》---周志明
 

java内存区域与内存溢出异常

JVM运行时数据区

JVM运行时数据区

Hotspot虚拟机在java堆中对象分配、布局、访问

1.对象的创建

对象的创建

堆内存划分可用空间

jvm垃圾收集器是否带有压缩整理功能---决定--->堆内存是否规整
堆内存是否规整---决定--->堆内存分配方式

堆内存规整:指针碰撞算法 例如:垃圾收集器带有压缩整理功能---->Serial、ParNew带Compact过程的收集器;

堆内存不规整:空闲列表 例如:垃圾收集器带有压缩整理功能---->CMS基于Mark-Sweep算法的收集器;

并发情况,对象在JVM中创建

问题:多个对象同时分配空间,指针修改指向

解决方案:

  • 对分配内存空间的动作进行同步处理
    虚拟机保证更新操作的原子性:采用CAS+失败重试的方式
  • 内存分配的动作按线程划分在不同的空间中进行
    本地线程分配缓存(Thread Local Allocation Buffer):每个线程预先在堆中分配一小块内存

2.对象的内存布局

3.对象的访问定位

创建对象---目的--->使用对象
java程序操作对象:通过栈上的reference数据
虚拟机具体实现---决定--->对象访问方式

目前主流对象访问方式

  1. 使用句柄

优点:对象被移动时,只改变句柄中实例数据指针,而reference无需修改

  1. 直接指针
    优点:速度更快,节省了一次指针定位的时间开销


注:以上皆个人理解,如有错误,请大佬赐教,在此谢过