今日开始拜读大作 深入理解JVM虚拟机 在此做一些笔记记录:

1.关于java运行时数据区域,其实远不止堆和栈,在这里粗浅的有个认知:

1)程序计数器:一块比较小的内存区域。字节码解释器需要通过计数器去执行下一条指令。考虑一下多线程处理的问题,为了能够让线程切换间还能找到原先执行的位置,有必要为每一个线程开辟一个内存区域。我们称这样的内存区域是线程私有的。[额外注意:当执行一个java程序时,计数器记录字节码执行位置,当执行本地方法,记录空(undifined)。这个内存区域没有OutOfMemoryError。]

2)java虚拟机栈:也是线程私有的内存区域。一个方法的执行会在此内存创建一个栈帧(基本数据结构,后会详述),一个方法的执行到结束,对应了栈帧的入栈和出栈。其中局部变量表是我们通常所说的堆和栈中的栈了,记录了基本类型、引用类型(可以是指针,也可以是句柄)。这个内存区域会抛出StackOverflowError和OutOfMemoryError。

3)本地方法栈:与虚拟机栈功能类似,只不过这块内存是为了native方法服务的。与虚拟机栈一样抛出两种异常。

4)java堆:线程共享的内存块,最大的一块内存区域,用于管理创建的对象,也是GC垃圾处理器主要管辖范围。堆中无法继续为新实例分配空间,也无法扩展内存,会抛出OutOfMemoryError。

5)方法区:可以认为是堆的一个逻辑部分,用来存放类信息、常量、静态变量、即时编译器编译后的代码。由于GC管辖的划分方式,堆可以分为新生代和老年代,从而有人认为方法区是永久代(并不合理,也不靠谱)。会抛出OutOfMemoryError。[注:此处有运行时常量池。类文件中包含了常量信息,我们称为类常量池,运行时他们会被加入运行时常量池,同时运行时也能通过诸如String的intern()加入常量池。]

6)之外:直接内存:也是需要留意的,物理内存决定了上限。

2.浅谈一个对象的创建过程:

一句简单的new: 虚拟机在堆上为新实例开辟空间(线程间的冲突问题,一方面可以CAS保证原子性,也可以为线程单独先开辟一个小的线程堆,完成了创建再同步)--->除了对象头外所有值初始化为零值--->对象的类信息、哈希码值、GC年代等放入对象头---><init>你所写的对象初始化逻辑。

对象:对象头+数据信息+对其填充(没啥用)。

3.堆溢出的解决方式:

在java启动项中加入参数-XX:+HeapDumpOnOutOfMemoryError,可以获得堆内存快照,运用eclipse memory analyzer打开分析。如果是内存泄漏,可以根据GC root引用链找到泄露源头。如果不存在泄露,那么就需要考虑扩大内存,或者尽可能的减少一些生命周期过长,过于庞大的实例对象。

4.栈溢出(java栈和本地方法栈)

在单线程程序中,无论如何都会抛出StackOverflowError,这样很好理解,无论栈帧过大还是虚拟栈内存太小,都可以认为是栈内存不足/深度不足。在多线程程序中,为每个线程栈分配过多的内存将会抛出OutOfMemoryError,一般来说遇到这种情况,只能通过考虑减少堆内存、栈内存来更多的获得线程(操作系统所给的内存是有限的,将会被堆栈、进程所共享)。

5.关于常量池溢出:

首先记录一个很有趣的问题:

在JDK1.6下输出的是两个false,而到了JDK1.7下输出变成了true,false。在1.6时,intern方法会将首次遇到的字符串复制到常量池中,并返回引用。StringBuilder实例与常量池实例一定不是同一个东西,必然是false。而在1.7后,intern将首次遇到的字符串添加到常量池,但不复制,因此第一条输出true。但是考虑java这个字符串已经存在与常量池中,所以第二个必然返回false。

方法区溢出是需要注意的:往往回收类十分的苛刻,对于动态产生类,或者CGLib这类加强类或者大量jsp文件...的地方,一定要格外小心。

6.直接内存泄露

如果发现OOM下HeapDump文件很小,基本可以考虑是直接内存泄露了。

阅读 深入理解JVM虚拟机笔记一相关推荐

  1. 2020-5-9 开始阅读深入理解java虚拟机

    深入理解java虚拟机笔记 day1 读完前三章 关于Jit编译器和解释器和关系,见博客:https://www.cnblogs.com/insistence/p/5901457.html HotSp ...

  2. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  3. 接口多个实现类加载哪个_深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  4. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  5. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

    本文转自: https://juejin.im/post/59e6c1f26fb9a0451c397a8c 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...

  6. 徐无忌深入JVM虚拟机笔记:Java代码到底是如何运行起来的?

    徐无忌深入JVM虚拟机笔记:Java代码到底是如何运行起来的? 完成:第一遍 1.Java代码到底是如何运行起来的? Demo.java编写的源文件 打包成:Jar包即Demo.class 通过Jav ...

  7. 深入理解JVM虚拟机之垃圾回收

    深入理解JVM虚拟机之垃圾回收 什么叫做垃圾? 没有引用指向得对象都称为垃圾,好比如我们放风筝,哪些断了线得风筝都称之为垃圾. JVM怎么查找这些垃圾 一般又两种算法,1.可达性分析.2.引用计数 引 ...

  8. 深入理解JVM虚拟机_4 JVM内部结构分析-栈

    深入理解JVM虚拟机_4 JVM内部结构分析-栈 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 栈 1. Java 虚拟机栈也是线程私有的,它的⽣命周期和线程相同,描述的是 Jav ...

  9. 深入理解JVM虚拟机 - 自我编译JDK

    深入理解JVM虚拟机 - 自我编译JDK <深入理解JVM虚拟机>看过了好几遍了,对于编译一个JDK源码有很强的冲动.这里主要实战使用阿里云进行编译实战 为什么使用阿里云? 个人电脑奋斗四 ...

  10. 深入理解JVM虚拟机读书笔记——内存模型与线程

    注:本文参考自周志明老师的著作<深入理解Java虚拟机(第3版)>,相关电子书可以关注WX公众号,回复 001 获取. 1. Java内存模型 JMM概述: Java 内存模型指的是 JM ...

最新文章

  1. 参加过java培训机构的学员如何找出路
  2. 如何把pdf转换为txt文档,pdf转txt的好方法
  3. Ubuntu下用gcc与nasm联合编译
  4. oracle 11.2.0.4 mos,【翻译自mos文章】在RHEL7 or OEL7上安装oracle 11.2.0.4 db时的
  5. Bug整理——阿里Ons高版本引入后Spring项目不打印日志问题
  6. swagger 修改dto注解_Swagger 详解
  7. 【C++】错误处理和异常处理
  8. php 写入内存缓存,示例:通过内存缓存来提升性能
  9. 如何在Ubuntu中修改默认程序
  10. 现在生意不是能不能干的问题
  11. 【转载】自动化测试:为什么受伤的总是我?
  12. UVALive 5760 Alice and Bob
  13. Three.js 零基础保姆级教程
  14. 推荐一款专业串烧歌曲的音乐合并软件
  15. matlab绘制xy色度图函数
  16. 【信管1.1】信息系统与信息化
  17. [干货][互联网]备战春招秋招的经验分享
  18. NCCL+Ubuntu20.04安装
  19. s:iterator各种遍历用法
  20. 在GATE中用ICTCLAS处理多个文档

热门文章

  1. 我的世界java版启动器更新_我的世界:统一启动器发布、java版更新1.16.5,本周mc新闻大事件...
  2. Github 爆火!程序员疯抢的 Java 面试宝典(PDF 版)限时开源
  3. 幼儿园学校网站JAVA_基于jsp的幼儿园网站-JavaEE实现幼儿园网站 - java项目源码
  4. 60道SCJP考试真题精解
  5. 调用百度“搜索建议(BaiduSuggestion)”的 API
  6. MindSpore,易用性提升的思考与实践
  7. 基于javaweb+springboot的在线购书系统网上书店图书商城(前台、后台)(java+Springboot+ssm+mysql+maven)
  8. 惠普p1106打印机安装步骤_「惠普打印机驱动安装」惠普P1106打印机怎么安装驱动? - seo实验室...
  9. 在电脑上怎么做报表新手_在电脑上如何制作表格_电脑制作表格的步骤教程-系统城...
  10. WAP PUSH介绍