`

JVM 结构小结

    博客分类:
  • Java
 
阅读更多

JVM的内存模型和.Net CLR的内存模型有很多相似的地方。《.Net CLR 内存模型小结》

 



1 类加载器(ClassLoader)

1.1 Class Loader 的分类

  • 启动类加载器(BootStrap Class Loader):加载 rt.java (Java基础类库)。
  • 扩展类加载器(Extension Class Loader):加载扩展功能 jar 包。
  • 系统类加载器(System Class Loader):即 AppClassLoader。加载启动参数 classpath 中的 jar 包,包括用户自己写的类。
  • 用户自定义类加载器(User Defined Class Loader):供用户自己手动控制加载过程。

 

1.2 Class Loader 的工作过程

1.2.1 装载

  • 装载 .class 文件。
  • 双亲委派模型(Parent Delegation Model)。Parent Class Loader 无法加载时再由自己加载类。保证安全加载,防止恶意冒充核心包。

 

1.2.2 链接

  • 校验 .class 文件是否符合规范,是否符合当前 JVM。
  • 把类型信息合并到 JVM 运行时中(方法区)。
  • 为类分配内存(如,类的静态字段)。

 

1.2.3 初始化

  • 只有类第一次被访问到,才会做初始化。
  • 初始化静态变量,执行静态代码,静态构造函数。

 

2 运行时数据区(Runtime Data Area)

2.1 方法区(Method Area)(线程共享)

  • 存储类型信息。SUN JDK 中对应 持久代(Permanent Generation)。
  • 为加快速度,通常为每个非抽象类创建私有方法表。利于多态的实现。

 

2.2 堆(Heap)(线程共享)

2.2.1 新生代区(Yong Area)

  • 存放新生的对象;频繁收集。
  • 1个 Eden Space:
    • 新创建的对象进入 Eden Space。
    • Eden Space 中的 Thread Local Allocation Buffer (TLAB)
      • 默认占 Eden Space 的 1%,线程私有。
      • 为提高效率,针对不存在线程共享,同时适合被快速GC的小对象,会优先被分配到 TLAB。
  • 2个相同大小的 Survivor Space:
    • 用于 Minor GC 时的对象复制。主要目的是用空间换时间,从而提高 GC 的速度。

 

2.2.2 老年代区(Old Area)

存放生命周期较长的对象;较少收集。

 

2.2.3 GC 原理(类似 .Net CLR 中的 GC)

GC 监控对象地址、大小、使用情况等,(用有向图)记录和管理堆中的对象,以确定哪些对象可达,哪些对象不可达。当对象不可达时,GC有责任回收其内存空间。程序员可以主动调用 System.gc(),通知GC运行,但Java语言规范不保证GC一定会执行。

 

2.2.4 两种 GC 模式

  • GC (Minor GC):收集 Yong Area。
  • Full GC (Major GC):收集 Yong + Old

 

2.2.5 并不是所有的对象都在堆上分配

  • 一种是上述 TLAB 的情况(虽然TLAB属于堆,但它是线程私有的,与一般意义上线程共享的堆不同)。
  • 另一种是在线程栈上分配。JVM 在 Server 模式下可开启“逃逸分析”,如果分析出某个对象永远只在某个方法、线程的范围内,这个对象就可以在线程栈上分配。

 

2.2.6 OutOfMemoryError (OOM)的两种类型

  • Java Heap Space:调整参数 -Xms(初始堆大小)和 -Xmx(最大堆大小)
  • PermGen Space:调整参数 -XX:PermSize(初始Perm堆大小)和 -XX:MaxPermSize(最大Perm堆大小)

 

2.3 Java 栈(Java Stack)(线程私有)

  • 分为 局部变量区、操作数栈、帧数据区。存储方法参数、局部变量、中间运算结果、提供其它模块(PC Register)所需数据。
  • 一个栈帧对应一个方法的调用。调用方法时入栈,方法返回时出栈。
  • 局部变量区:以字长为单位(32bit)。byte,short,char 会被转换为 int;long,double 占2个字长(64bit)。

 

2.4 本地方法栈(Native Method Stack)(线程私有)

类似 Java Stack,针对本地方法。SUN JDK 中就是 Java Stack。

 

2.5 PC 寄存器(Program Counter Register)(线程私有)

保存线程当前指令所在位置。

 

3 执行引擎(Execution Engine)

  • 包括 解释执行、编译执行、自适应优化执行、硬件芯片执行。
  • 编译执行:JIT(Just-In-Time)运行时将字节码编译为机器码,重复利用。
  • 自适应优化执行:如HotSpot VM,将热点代码编译为本地代码提高效率,热点消退后又取消这部分编译后的本地代码。
  • SUN JDK 编译模式
    • Client:轻量级,占用内存少。
    • Server:占用内存多。可开启对象“逃逸分析”。 

4 本地方法接口(Native Interface)

 

  • 大小: 22.4 KB
分享到:
评论

相关推荐

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第104讲 字节码执行引擎小结 00:03:38  第105讲 总结与回顾 00:10:55  第106讲 happens-before简单概述 00:15:17  第107讲 重排序问题 00:23:19  第108讲 锁的内存语义 00:13:54  第109讲 volatile的...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 126 5.3.5 选择收集器降低延迟 / 130 5.4 本章小结 / 133 第三部分 虚拟机执行子系统 第6章 类文件结构 / 136 6.1 概述 / 136 6.2 无关性的基石 / 136 6.3 Class类文件的结构 / 138 6.3.1 魔数与Class文件...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,...第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟

    自己动手写Java虚拟机 张秀宏 著

    1.5 本章小结 第2章 搜索class文件 2.1 类路径 2.2 准备工作 2.3 实现类路径 2.3.1 Entry接口 2.3.2 DirEntry 2.3.3 ZipEntry 3 2.3.4 CompositeEntry 2.3.5 WildcardEntry 2.3.6 Classpath 2.4 测试本...

    Java虚拟机

    1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行...

    突破程序员基本功的16课.part2

    1.3 小结 第2课 对象与内存控制 2.1 实例变量和类变量 2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象...

    Hadoop实战中文版

    6.3 性能调优 6.3.1 通过combiner来减少网络流量 6.3.2 减少输入数据量 6.3.3 使用压缩 6.3.4 重用JVM 6.3.5 根据猜测执行来运行 6.3.6 代码重构与算法重写 6.4 小结 第7章 细则手册 7.1 向任务传递作业...

    Hadoop实战(陆嘉恒)译

    案例研究12.1 转换《纽约时报》1100 万个库存图片文档12.2 挖掘中国移动的数据12.3 在StumbleUpon 推荐最佳网站12.3.1 分布式StumbleUpon 的开端...系统结构12.4.2 ES2 爬虫12.4.3 ES2 分析12.4.4 小结12.4.5 参考文献

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     1.3 小结  1.4 思考题 第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 ...

    Spring.3.x企业应用开发实战(完整版).part2

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    Spring3.x企业应用开发实战(完整版) part1

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    1.3 本章小结 第2 部分 数据逻辑. 2 将数据导入导出Hadoop. 2.1 导入导出的关键要素 2.2 将数据导入Hadoop . 2.2.1 将日志文件导入Hadoop 技术点1 使用Flume 将系统日志文件导入HDFS 2.2.2 导入...

    Hadoop实战

    1286.3 性能调优 1296.3.1 通过combiner来减少网络流量 1296.3.2 减少输入数据量 1296.3.3 使用压缩 1296.3.4 重用JVM 1326.3.5 根据猜测执行来运行 1326.3.6 代码重构与算法重写 1336.4 小结 134第7章 细则手册 ...

    Hadoop实战(第2版)

    技术点79 MapReduce 函数、作业和管道的单元测试13.1.3 ...JVM 启动参数13.2.4 高效调试的编码准则技术点84 调试和错误处理13.3 MapReduce 陷阱技术点85 MapReduce 反模式13.4 本章小结附录A...

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

Global site tag (gtag.js) - Google Analytics