JVM内存及GC回收
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回收相关推荐
- 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了
点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...
- 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
转载自 JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
转载自 JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
转载自 JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...
- JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...
- JVM内存与垃圾回收篇——堆
堆 堆的核心概念 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域. J ...
- JVM内存与垃圾回收篇——JVM与Java体系结构
前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设 ...
- 深入浅出JVM内存模型+垃圾回收算法
文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...
最新文章
- 大数据环境下该如何优雅地设计数据分层
- 从熵到交叉熵损失的直观通俗的解释
- python面试-Python面试题总结
- mac 系统使用macaca inspector 获取iphone真机应用元素
- R开发(part12)--基于RC的面向对象编程
- 关于 VDD VSS VCC VEE VPP
- Android之error: void value not ignored as it ought to be(In function ‘callMethod2‘)解决办法
- App Engine中的Google Services身份验证,第2部分
- 快速教程:使用Cython来扩展Python/NumPy库
- 12. Qt中相关字符串处理
- sql2012服务器桌面图标,Windows Server 2012 修改桌面图标
- tcp压力测试工具_DNS压力测试工具之——DNSperf
- NFC技术:Android中的NFC技术
- python工厂模式和单例模式_python之单例模式和工厂模式
- 从零开始学习html(十)CSS格式化排版——下
- P1196 [NOI2002] 银河英雄传说
- 谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks
- uniapp字体图标的使用
- Android 中 QQ 和 微信打开第三方应用
- 如何在ps中添加图片上的塑料布效果
热门文章
- Spring Boot CLI设置和HelloWorld示例
- 使用Docker快速搭建FTP服务器
- Java Singleton类中的线程安全性的示例代码
- Intellij IDEA 社区版集成 Database Navigator 数据库管理工具
- 正则规则大全 JAVA
- 【Day06】请画出 Css 盒模型,基于盒模型的原理,说明相对定位、绝对定位、浮动实现样式是如何实现的?
- chrome关闭自动更新 mac
- 【C语言】判断某一正整数是否为完数
- MATLAB如何进行系统辨识(传递函数)
- vim 文本编辑器_Vim Windows安装指南–如何在PC上的PowerShell中运行Vim文本编辑器