1.HotSpot VM:热点代码探测能力,与JIT技术共同进行编译优化,输出高质量代码

2.运行时数据区域

  

  • 程序计数器:控制程序执行顺序,无OOM
  • Java虚拟机栈:生命周期与线程一致,描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储 局部变量表、操作数栈、动态链接、方法接口等信息

  OOM情况:(1)线程深度:线程请求的栈深度>虚拟机所运行的最大深度;(2)线程大小:虚拟机动态扩展时无法申请到足够的内存

  

  • 本地方法栈:本地方法栈则为虚拟机所使用的Native方法服务

  此区域会抛StackOverflowError 和 OutofMemoryError异常

  

  • Java堆区:用于存放对象实例,可能会单独为线程分配私有缓冲区(TLAB)

  OOM:无内存可以扩展

  

  • 方法区:存储已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

  可能被称为永久代,但是这种处理方式已被Native Memory取代

  GC很少,主要是针对常量池的回收和类型的卸载

  • 运行时常量池:方法区的一部分

  Class文件除了类的版本、字段、方法、接口等描述信息外,还有一项存储编译器生成的各种字面量和符号引用的常量池

  支持动态性,运行时可以将新的常量放入池中

  OOM:无法申请内存

  

  • 直接内存:

  非虚拟机运行时数据区的一部分,但是可能有OOM异常

  NIO:基于Channel与Buffer,使用Native函数库直接分配内存,提高性能

3.HotSpot VM

  • 对象创建过程

  • 对象的内存布局:三种类型

  对象头:运行时数据(如哈希码、GC分代年龄、线程持有的锁等)与类型指针(执行类元数据,JVM通过这个指针确定对象实际类型)

  实例数据:类所预定义的各种类型的字段内容

  对其填充:字节对齐

  • 对象的访问定位:两种方法

  句柄访问:引用中存放的是稳定的句柄地址,对象移动时,只需要改变句柄中实例数据的指针即可

  

  指针访问:更快,通过引用直接访问对象实例数据,解决了一次指针定位的开销

  

4.实战异常

5.参考

  https://blog.csdn.net/lin74love/article/details/81167761

  https://juejin.im/entry/5ba1a379e51d450e70426a2a

深入理解Java虚拟机1-chap1-2-斗之气8段的更多相关文章

  1. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  2. 《深入理解 java虚拟机》学习笔记

    java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.

  3. (1) 深入理解Java虚拟机到底是什么?

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java ...

  4. 深入理解java虚拟机(7)---线程安全 & 锁优化

    关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...

  5. 深入理解java虚拟机(6)---内存模型与线程 & Volatile

    其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...

  6. 深入理解java虚拟机(5)---字节码执行引擎

    字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...

  7. 深入理解java虚拟机(4)---类加载机制

    类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...

  8. 深入理解java虚拟机(1)------内存区域与内存溢出

    在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...

  9. 什么是HotSpot VM & 深入理解Java虚拟机

    参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...

  10. 【Todo】深入理解Java虚拟机 读书笔记

    有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...

随机推荐

  1. Linux 设备树属性在驱动中获取方法

    获取设备树中的属性,可以直接当设备树为配置文件,方便,快捷. 一般probe之后,调用的 probe函数的参数, 是一个设备结构体. 拿 spi 为例子 static int wk2xxx_probe ...

  2. mail 发送邮件

    (1) 直接使用shell当编辑器 # mail -s "Hello from linuxde.net by shell" admin@linuxde.net hello,this ...

  3. 转载记录一个有效的jetbrains激活码

    来自:https://blog.csdn.net/ahun535915415/article/details/80687762 K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDS ...

  4. Ubuntu下安装Kafka Manager

    参考 : kafka管理器kafka-manager部署安装 下载Kafka Manager,并进行打包,由于Kafka manager是由scala写的,所以需要由sbt的支持 git clone ...

  5. 4 playlook-Jinja2 filter

    jinja2模板,不多解释,请看例子 [root@LeoDevops jinjatwo]# cat j1.yaml - hosts: u12 gather_facts: False vars: lis ...

  6. go与c语言的互操作

    https://tonybai.com/2012/09/26/interoperability-between-go-and-c/ https://tonybai.com/2016/02/21/som ...

  7. FastJSON 设置默认参数,全局配置方式 和 一些使用方式、坑

    如果要被序列化的对象含有一个date属性或者多个date属性按照相同的格式序列化日期的话,那我们可以使用下面的语句实现: 在应用的的Main方法体里配置全局参数: JSONObject.DEFFAUL ...

  8. JS精准倒计时(支持自定义模板)

    /** * 倒计时 Create By TuJia @2017.10.17 * 使用方法: * leftTimer.run(container[,theme][,callback]); * * 支持 ...

  9. phantomjs 是什么?----主要是mac下面

    phantomjs 是什么? PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG. pha ...

  10. Educational Codeforces Round 1

    598A - Tricky Sum    20171103$$ans=\frac{n(n+1)}{2} - 2\sum_{k=0}^{\left \lfloor \log_2 n \right \rf ...