JVM体系结构概述

1)、简述

JVM——操作系统——硬件体系
PS:安卓(jvm+linux内核)
Classfile——类装载子系统(入口)——运行时数据区——执行引擎(出口)——本地方法接口——本地方法库

2)、三种JVM(java规范)

①Sun公司的HotSpot(被Oracle收购)
②BEA公司的JRockit(被Oracle收购)
③IBM公司的J9 VM

运行时数据区

1)、方法区

是堆的一个逻辑部分,但其还有个别名(Non-Heap)
所有线程共享
存储已经被虚拟机加载的类信息、常量、静态变量、运行时常量池
即编译器编译后产生的数据等
JVM虚拟机停下来进行回收

2)、Java栈

存储局部变量+实例方法,局部变量表存放了编译器可知长度的各种基本类型、对象引用(堆中地址)
方法执行完,自动释放,不存在垃圾回收问题
栈帧:本地变量、栈操作、栈帧数据

3)、本地方法栈

本地方法接口、本地方法库(ddl)
Native Method Stack登记native方法,在Execution Engine执行时加载本地方法库
启动线程和进程时,由操作系统控制

4)、Heap堆

一个JVM只存在一个堆内存,其大小可以调节。类加载器读取类文件后,需要把类方法、常变量存放到堆内存中,保存所有引用类型的真实信息,方便执行器执行

逻辑上三部分(Java7之前)
新生区(Young/New)、养老区(Old/Tenure)、永久区(Perm)

①新生区分为:
Eden(伊甸区,大小占比:8)、 Survivor 0(1)、Survivor 1(1)(from/to区)

Eden区满了经历MinorGC,幸存者存储到Survivor 0,再满将Eden和S0有效存储到S1,S0和Eden进行清空;再满将Eden和S1有效存储到S0,S1和Eden进行清空,默认反复15次
Ps:当Eden区的幸存者过多时,会直接进入养老区

②进入养老区(链接池、线程池等)
养老区满时,触发FullGC,清理不了会报java.lang.OutOfMemoryError

③永久区(和新生区及养老区无直接关联)
常驻内存区域,存放JDK自身携带的Class、Interface等,运行环境必需信息
不会被垃圾回收回收掉

堆结构在jdk版本迭代下的变化
Jdk1.6及之前:有永久代,常量池在方法区
Jdk1.7:有永久代,已逐步“去永久代”,常量池在堆
Jdk1.8及以后:无永久代,常量池在元空间(方法区)

5)、程序计数器(PC寄存器)

每个线程都私有一个程序计数器(指针),指向方法区中的方法字节码(用来存储
指向下一条指令的地址),由执行引擎读取下一条指令,是一个非常小的内存空间,自动释放

6)、JVM参数调优

①默认为:内存/64~~~~~内存/4
查看内存:Runtime.getRuntime().maxMemory()/totalMemory()

②调节并打印内存:-Xms大小 -Xmx大小 -XX:+PrintGCDetails

Tips:MAT插件(Eclipse插件)可分析dump文件,定位内存泄漏
使用-Xms大小 -Xmx大小 -XX:+HeapDumpOnOutOfMemoryError 来产生dump文件
使用IDEA时,需设置dump文件位置 -XX:HeapDumpPath=路径

GC回收(分代收集算法)

1)、引用计数法(被淘汰)

需维护计数器,较难处理循环引用

2)、复制算法(Copying)

年轻代Minor GC使用,默认15次,可通过-XX:MaxTenuringThreshold来设定
效率高、无内存碎片,需要双倍空间(需存活率较低)

3)、标记清除(Mark-Sweep)

老年代FullGC,标记(对存活对象标记),清除(扫描,回收未标记对象)
不需要额外空间、但需扫描两次,产生内存碎片
Ps:执行标记清除时,需暂时停止功能(避免刚进入恰好标记完,未被标记的对象清除)

4)、标记压缩(Mark-Compact)

老年代FullGC,标记(对存活对象标记),压缩(将存活对象转移到连续内存)
效率不高,需暂时停止功能

5)、标记清除压缩(Mark-Sweep-Compact)

结合Mark-Sweep和Mark-Compact

JVM内存及GC回收相关推荐

  1. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  2. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  3. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  4. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  5. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  6. JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...

  7. JVM内存与垃圾回收篇——堆

    堆 堆的核心概念 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域. J ...

  8. JVM内存与垃圾回收篇——JVM与Java体系结构

    前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设 ...

  9. 深入浅出JVM内存模型+垃圾回收算法

    文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...

最新文章

  1. 大数据环境下该如何优雅地设计数据分层
  2. 从熵到交叉熵损失的直观通俗的解释
  3. python面试-Python面试题总结
  4. mac 系统使用macaca inspector 获取iphone真机应用元素
  5. R开发(part12)--基于RC的面向对象编程
  6. 关于 VDD VSS VCC VEE VPP
  7. Android之error: void value not ignored as it ought to be(In function ‘callMethod2‘)解决办法
  8. App Engine中的Google Services身份验证,第2部分
  9. 快速教程:使用Cython来扩展Python/NumPy库
  10. 12. Qt中相关字符串处理
  11. sql2012服务器桌面图标,Windows Server 2012 修改桌面图标
  12. tcp压力测试工具_DNS压力测试工具之——DNSperf
  13. NFC技术:Android中的NFC技术
  14. python工厂模式和单例模式_python之单例模式和工厂模式
  15. 从零开始学习html(十)CSS格式化排版——下
  16. P1196 [NOI2002] 银河英雄传说
  17. 谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks
  18. uniapp字体图标的使用
  19. Android 中 QQ 和 微信打开第三方应用
  20. 如何在ps中添加图片上的塑料布效果

热门文章

  1. Spring Boot CLI设置和HelloWorld示例
  2. 使用Docker快速搭建FTP服务器
  3. Java Singleton类中的线程安全性的示例代码
  4. Intellij IDEA 社区版集成 Database Navigator 数据库管理工具
  5. 正则规则大全 JAVA
  6. 【Day06】请画出 Css 盒模型,基于盒模型的原理,说明相对定位、绝对定位、浮动实现样式是如何实现的?
  7. chrome关闭自动更新 mac
  8. 【C语言】判断某一正整数是否为完数
  9. MATLAB如何进行系统辨识(传递函数)
  10. vim 文本编辑器_Vim Windows安装指南–如何在PC上的PowerShell中运行Vim文本编辑器