1.运行时数据区存放的内容:

区域         权限 作用
程序计数器 线程私有 记录的是当前线程字节码的行号;java代码,执行jvm字节码指令的地址
栈stack 私有

存放局部变量、操作数栈、线程创建时有的;

本地方法栈,

本地方法栈
方法区  线程共享

类的版本、字段、方法、接口;静态变量常量池(字面量+符号引用)

jdk6,有永久代,常量池放在方法区

jdk7有永久代,常量池在堆

jdk8无永久代,常量池元空间中

堆heap new出来的所有实例对象;堆是垃圾回收的主要对象

2.对象的结构

对象由对象头、实例数据、对齐填充组成

  • 对象头:MarkWord(hash\GC年龄,锁标志、线程持有锁、偏向线程ID、时间戳)+类型指针(如果是数组的话,还有个数组长度)
  • 实例数据:相同宽度的数据块放一块
  • 对齐标识:8字节的整数倍
备注:
创建对象的几种方式:
1.new
2.反射
3.克隆
4.序列化、反序列化jvm有哪些:
1.oracle:hotspot
2.Alibaba:taobaojvm
3.IBM:J2

3.堆空间分配

新创建的对象在堆中需要分配内存空间,方式有两种:指针碰撞和空闲列表

1.指针碰撞

堆分为未分配和已分配两个区域,使用指针来区分(指针的两边分别为已分配和未分配?)。

2.空闲列表(字典)

重要的参考资料:Java虚拟机内存管理白皮书

4.多线程分配时,线程安全性的问题

解决线程安全问题有两种方式:线程同步和TLAB

TLAB:thread local allocation buffer

记录三个指针:start end top

TLAB默认占用eden的1%空间

5.heap区的垃圾回收机制

垃圾回收的重点是,如何回收、何时回收。

JVM内存中的堆是垃圾回收的主要区域,分为新生代和老年代。

垃圾回收机制的算法包括,识别垃圾算法、清除垃圾算法。

下图是堆空间的结构:

5.1识别垃圾算法:

引用计数法

可达性分析

引用计数法在某些场景下会出现循环引用的问题,所以很少使用了

循环引用的问题:
class MyObj{public MyObj childNode;
}
public class referenceCounter{public static void main(String[] args){MyObj obj1 = new MyObj();MyObj obj2 = new MyObj();obj1.childNode = obj2;obj2.childNode = obj1;}
}

可达性分析更加常用一些:

GCroots(根搜索法)能直接索引到的就不是内存垃圾,其他的则可以被清理掉了

5.2清除垃圾算法:

标记清除算法(Mark-Sweep):实现简单,但有内存碎片
         复制算法(copying):无内存碎片,但是内存利用率低
         标记整理算法(Mark-Compact):没有内存碎片,内存利用率也高,但是算法相对比较复杂
         分代回收:分为新生代和老年代

标记清除算法:

复制算法:

标记整理算法:

分代回收:

当对象不断创建时,首先存放在eden区,当eden区存满时,触发minorGC,将eden区的数据移到from中,from和to不断对调

当from或to对空间满了,触发MaxGC,将“年龄最大”的移到老年代堆空间

当老年代对空间满时,触发fullGC:stop the world(如果一直fullGC,就会有程序假死的问题)

执行回收操作的是垃圾回收器

CMS:

  1. 初始标记:stop-the-world,标记GCRoots直接关联的对象
  2. 并发标记:并发追溯标记,程序不会停顿
  3. 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
  4. 并发清理:清理垃圾对象,程序不会停顿
  5. 并发重置:重置CMS收集器的数据结构

G1回收器:

  1. G1垃圾收集器将整个 JVM 内存分为多个大小相等的;region,年轻代和老年代逻辑分区 。
  2. G1 是 Java9 以后的默认垃圾回收器了
  3. G1 在整体上使用标记整理算法,局部使用复制算法
  4. G1 的每个 Region 大小在 1-32M 之间,可以通过  -XX:G1HeapRegionSize=n 指定区大小。
  5. 总的 Region 个数最大可以存在 2048 个,即heap最 大能够达到32M*2048=64G
  6. 0.5<obj<1,那么放到old区,old标记为H; 1<obj<n,连续的n个region,作为H

Jvm优化相关命令、工具

  • jps

主要是看虚拟机的相关参数配置

  • jstat

类加载,内存,垃圾收集,jit编译信息
    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

  • jinfo

实时调整和查看虚拟机参数

  • jmap

侧重查看内存信息

  • jhat

分析java堆信息,以html的形式显示出来,支持对象查询语言

  • jstack

线程堆栈信息

  • jconsole和jvisualvm工具

https://visualvm.github.io/pluginscenters.html

【中级04】Java 虚拟机 Runtime Data Areas以及垃圾回收相关推荐

  1. 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 即使在可达性分析算法中不可达的对象,也并非是"非死不可"的,这时候它们暂时处于& ...

  2. Java虚拟机(十四)——垃圾回收算法

    文章目录 垃圾回收相关算法 标记阶段 引用计数算法 可达性分析算法(根搜索算法.追踪性垃圾收集) 基本思路: GC Roots 有哪几类? 注意 对象的finalization机制 清除阶段 标记-清 ...

  3. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  4. 【深入理解Java虚拟机】读后感:JVM垃圾回收小结

    JVM垃圾回收小结 1.GC 问题侧重点 虚拟机栈.本地方法栈.程序计数器随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出而有条不紊地执行着出栈与入栈操作,每个栈帧分配多少内存基本是在类结构确定下 ...

  5. 生存还是死亡 —— Java虚拟机如何判断对象是否需要回收

    带着问题阅读 Java的内存区域中,有哪些区域是垃圾收集器所关注的? 怎么判断一个对象是不是需要回收? 导语 前面两讲,给大家讲解了Java的内存区域和常见的内存溢出异常,从这一讲开始,我们来学习Ja ...

  6. Java对象的生命周期与垃圾回收以及四种引用

    转载请注明出处: Java对象的生命周期 与 垃圾回收 - ITeye博客 - 老Man 创建对象的方式 用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.re ...

  7. java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  8. Java中谈尾递归--尾递归和垃圾回收的比较

    一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点:     1.调用的是同一 ...

  9. JVM Run-Time Data Areas 参数相关

    jvm定义了各个运行时数据区: Run-Time Data Areas1)The pc Register2)Java Virtual Machine Stacks3)Heap4)Method Area ...

最新文章

  1. C# WinForm开发系列 - DataGrid/DataGridView
  2. [转]tomcat部署与Context
  3. 【Python爬虫】知识点简单总结
  4. JDK1.7 深入理解 LinkedHashMap
  5. canvas 2.0
  6. poj 2503 Babelfish trie树!!!!指针版和数组版 基础
  7. 学生选课系统代码-5-共用代码层
  8. 在对话框中进行消息映射((CEdit*)GetDlgItem(IDC_EDIT_TEST))-SetWindowText(this is a edit box)...
  9. 什么是OM3、OM4光纤跳线?
  10. oppok3如何刷机_OPPO K3刷机教程?
  11. 批量修改pdf文件名称的方法
  12. iOS 10 通知 --UserNotifications
  13. latex学习笔记——latex的字体字号设置
  14. STM32——RTC实时时钟原理+BKP寄存器原理
  15. 【区块链与密码学】第9-7讲:群签名在区块链中的应用 I
  16. 寻求区块链研究者老铁的帮助
  17. thinkphp生成带二维码的海报
  18. JavaScript面试题看这一篇就够了,简单全面一发入魂(持续更新 step1)
  19. Labview视觉一键尺寸测量仪,多产品,多尺寸,快速编辑, 测量,导出结果,定制开发,程序讲解,程序通用型高
  20. 企业数据化管理怎么做?

热门文章

  1. 计算机视觉︱图像取证技术
  2. 宝塔linux搭建环境注意事项
  3. 也来谈一谈js的浅复制和深复制
  4. WorkerMan 入门学习之(三)基础教程-Timer类的使用
  5. UVA 11478(差分约束 + 二分)
  6. 两种不同编码规则的查询
  7. 安卓开发应该知道的Drawable、Bitmap、Canvas和Paint的关系
  8. cacti+nagios整合(未成)
  9. 浅谈Chrome OS
  10. Django笔记8(模板引擎)