20161017

来源:互联网 发布:网络犯罪的特征有() 编辑:程序博客网 时间:2024/05/22 06:54
jvm运行时数据区
pc,记录线程执行的字节码的行号,控制流程以及线程切换
栈,后进先出结构,方法调用,栈桢,局部变量表,操作数栈,方法出口等
堆,逻辑上连续,存储对象
方法区,class文件,class对象,常量,static变量
运行时常量池,存在于方法区,保存class文件中的常量池的符号引用,常量,直接引用

创建对象
  • 加载类
new对象时,先检查运行时常量池有没有new的类的符号引用,没有的话需要加载类
  • 分配空间
为对象分配空间:类似栈的分配方法,移动指针,当垃圾清理是复制或标记整理模式时使用;采用记录表记录堆中空闲段来分配,当垃圾清理是标记清理模式时使用;tlab模式,即为每个线程分配堆空间,在这个空间里new对象,这样保证线程安全
  • 设置对象
设置对象头,记录对象对应的类,hash,锁,gc分代等信息
初始化对象空间,成员变量都变成0
  • 初始化
执行init方法

对象的内存布局
  • 对象头
存储对象自身的运行时数据,类型指针,数组还有数组长度
  • 对象数据
对象实例数据,父类对象数据也在内
  • 对齐填充

对象访问
  • 句柄访问
jvm有句柄池,句柄池记录对象地址和类地址,栈区的reference指向句柄池,优势:垃圾清理时减少指针数据变动
  • 直接指针
对象头直接存对象地址和类地址,优势:访问快

垃圾回收
  • 对象无用
引用计数器,无法解决循环引用
GC root可达性分析,通过引用链决定哪个对象无用,GC root包括:栈,静态变量,常量,本地栈

  • 引用分类
strong, 普通引用
weak, 内存不够时回收
soft, 下一次垃圾回收时回收
phantom,不影响垃圾回收,只是为了得到回收通知

finalize方法
gc root时候,如果对象没有重写finalize或者finalize已经被调用,必被回收;如果重写了finalize方法,把他加入f-queue队列,jvm会调用这个队列执行finalize,但这个方法只被执行一次

垃圾回收算法
复制算法
标记清除
标记整理

垃圾回收器
  • 新生代serial单线程复制,parnew多线程复制,parallel scavenge多线程,注重吞吐量复制
  • 老生代cms并发,减少停顿标记清除,serial old单线程标记整理,parallel old多线程,注重吞吐量标记整理
  • g1
  • cms过程:初始标记,并发标记,重新标记,并发清除

0 0
原创粉丝点击