深入理解Java虚拟机 读书笔记

走进Java


JDK

JDK(Java Development Kit)是用于支持Java程序开发的最小环境,包括 Java程序设计语言、Java虚拟机、Java API类库。

JRE

JRE(Java Runtime Enviroment)是支持Java程序运行的标准环境,包括Java SE API子集和Java虚拟机。

Java内存区域划分


程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。每个线程有一个私有的程序计数器,所以属于线程私有的内存。

Java虚拟机栈(Java Virtual Machine Stack )也是线程私有的,他的生命周期与线程相同。每个方法在执行的时候都会创建一个栈帧(Stack Frame)用于储存局部变量表、操作数栈、动态链接、方法出口等信息。一个方法的执行到结束,都对应着一个栈帧在虚拟机栈的入栈和出栈。

本地方法栈 与虚拟机栈相似,只是对应于Native方法。

方法区(Method Area) 是线程共享区域,它用来储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

用来存放Java对象

垃圾回收与内存分配策略


对象存活判定算法

引用记数算法不能解决循环引用的问题。Java采用可达性分析算法(Reachablity Analysis)来判定对象是否存活。
可作为GC Roots的对象包括下面几种:

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象
垃圾回收算法
  • 标记-清理算法(Mark-Sweep)
    效率问题和内存碎片问题
  • 复制算法
    不会有内存碎片,只用对半个区进行回收,但内存缩小到一半。商业虚拟机大部分采用这种算法。一个Eden两个Survivor,大小8:1。缺点,老年代浪费效率。
  • 标记-整理算法(Mark-Compact)
    对于老年代比较合适,只需移动部分存活对象填补内存空缺。
垃圾收集器

G1(Garbage-First)收集器是当今技术发展的最前沿成果之一。它是一款面向服务器应用的垃圾收集器。他的特点如下:

  • 并行与并发
    可利用多CPU、多核环境下的硬件优势,使用多个CPU缩短Stop-the-world停顿的时间。
  • 分代收集
  • 空间整合
  • 可预测的停顿
内存分配策略
  • 对象优先在Eden分配
  • 大对象直接进入老年代
  • 长期存活的对象将进入老年代
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容