Java虚拟机JVM的作用:

Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台。

JVM的体系结构包含三个主要的子系统和一个内存区,分别是:

  • 类装载子系统:定位及导入二进制class文件,校验被导入类的正确性,为类变量分配初始化内存,以及帮助解析符号引用。
  • 执行引擎:执行被转载类中的方法指令。
  • 自动内存管理:用于管理运行时数据区的分配和释放。
  • 本地方法和库:JNI,调用本地方法,c/c++库;执行引擎所需的本地方法库。
  • 运行时数据区:又叫做虚拟机内存或Java内存。其中又分为多个小区,包括:
    • 程序计数器,JVM规范中定义每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,即所谓的当前方法,程序计数器用于存储当前线程正在执行的Java方法的JVM指令地址
    • Java虚拟机栈,每个线程在创建是都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次Java方法调用。栈中存放基础数据类型和自定义对象的引用
    • 堆,是Java内存管理的核心区域,用于存放对象实例,堆被所有线程共享,堆内空间会被不同的垃圾回收器进行进一步细分,比如新生代、老年代
    • 方法区,用于存储元数据,比如类结构信息,以及对应的运行时常量池、字段、方法代码
    • 本地方法栈,与Java虚拟机栈类似,用于支持对本地方法的调用,每个线程都会创建一个。  

整体结构如下图所示:

更详细的运行时数据区如下图所示:

  从上图可以看出一个线程中包含程序计数器、Java虚拟机栈,本地方法栈,其是私有的,堆和方法区是共享的,堆中可划分为新生代区、老年代区等,方法区中包含了运行时常量池。 

   Java对象是否都分配在堆上?
  答:是的,虽然通过逃逸分析,JVM会在栈上分配哪些不会逃逸的对象,这在理论上是可行的,但是这完全取决于JVM设计者的选择,而最常用的Oracle hotspot JVM并未这么做,所有可以明确所有的对象实例都是创建在堆上的

  堆内存不足,会抛出java.lang.OutOfMemoryError:java heap space错误,可能原因是内存泄漏问题,也有可能是堆大小设定不合理
  栈内存不足,会抛出java.lang.StackOverFlowError错误,可能原因执行了一段死循环的调用代码

  Jconsole可对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。它是JDK字段的监控工具,可在JDK/bin目录下找到

  Java常见的垃圾回收器有哪些?
  垃圾回收器是和具体JVM实现紧密相关的,不同的厂商(IBM、Oracle),不同版本的JVM提供的选择也不同,以主流Oracle JDK分析,主要包括:
  ①、Serial GC,串行运行;作用于新生代;复制算法;响应速度优先;适用于单CPU环境下的client模式。
  ②、PerNew GC,并行运行;作用于新生代;复制算法;响应速度优先;适用于多CPU环节Server模式下与CMS配合使用
  ③、Parallel GC,并行运行;作用于新生代;复制算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
  ④、Serial Old GC:串行运行;作用于老年代;标记-整理算法;响应速度优先;单CPU环境下的Client模式。
  ⑤、Parallel Old GC:并行运行;作用于老年代;标记-整理算法;吞吐量优先,适用于后台运算而不需要太多交互的场景。
  ⑥、CMS GC,并行运行;作用于老年代;标记-清除算法;响应速度优先,存在内存碎片化问题,适用于互联网或者B/S业务
  ⑦、G1 GC,并行运行;作用于新生代或者老年代;标记-整理算法+复制算法;响应速度优先,是一种兼顾吞吐量和停顿时间的GC实现,JDK 9以后的默认GC选择,其内存结构类似棋盘的一个个region,region之间是复制算法,但整体上实际可以看做标记--整理算法,可以有效避免内存碎片,当Java堆非常大的时候,G1更有优势,适用于服务端应用

最新文章

  1. bzoj4458: GTY的OJ
  2. Libgdx 循环绘制图片时间隔的问题
  3. mysql学习(1)-linux操作系统源码包安装
  4. centos 搭建ftp服务器
  5. CCNA实验2.VLAN
  6. saltstack实战4--综合练习3
  7. ios -- cell的图片下载
  8. iOS越狱包 分类: ios相关 app相关 2015-06-10 10:53 152人阅读 评论(0) 收藏
  9. docker~swarm搭建docker高可用集群
  10. AI - TensorFlow - 起步(Start)
  11. CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解
  12. shell 命令 grep -R 查询包含指定内容的文件
  13. PHP-循环结构-数组
  14. Django基础之urls
  15. Mockito 简单使用
  16. (笔记)Linux 如何查看线程数最佳解决方案
  17. X-Requested-With导致CSRF失败
  18. 813. Largest Sum of Averages
  19. 自己编写jQuery插件 之 放大镜
  20. redis 持久化之 rdb 快照持久化

热门文章

  1. 苹果审核被拒,解析奔溃日志.txt转crash文件
  2. spring datasource 使用 proxool
  3. Linux应用之crontab定时任务的设置
  4. python-浅拷贝和深拷贝
  5. Feign 与 Hystrix
  6. 视图模型-Lambda表达式
  7. JavaScript 原型链学习(三)原型对象存在的问题 与 组合使用构造函数和原型
  8. H5开发:横屏适配
  9. URI/URL/URN的联系和区别
  10. MySQL5.7 编译安装