JVM内存结构和垃圾回收算法
jvm的内存结构:按照线程划分可分为两部分,一是线程独占的,二是线程共享的。线程共享的有方法区和堆,线程独占的有程序计数器,本地方法栈,虚拟机栈。方法区是一个模型规范,具体实现的话,是元空间和永久代,永久代是1.7的,1.8之后就被移除了,变成元空间了,元空间是分布在计算机内存的,脱离了java虚拟机内存,单独存在。
堆
堆内为老年代和新生代,新生代是用来存放新生的对象,一般占据堆的1/3空间,由于频繁的创建对象,所以新生代会频繁触发MinorGC进行垃圾回收;新生代又划分为三个区域,分别是Eden(8/10),ServiceFrom(1/10),ServiceTo(1/10);
Eden区:java新对象的出生地,(如果新创建的对象内存过大,则会直接分配到老年代),当Eden区内存不够时,就会触发MinorGC,对新生代区进行一次垃圾回收。
ServiceFrom:上一次GC的幸存者,作为下一次GC的被扫描者。
ServiceTo:保留了一次GC的幸存者。
MinorGC采用复制算法
1:eden,serviceFrom的对象复制到serviceTo(如果有对象的年龄够达到老年的标准,则放入老年代),并将年龄+1(如果serviceTo不够位置,则放入老年代)
2:清空eden,serviceFrom中的对象
3:serviceTo和serviceFrom互换,原serviceTo成为下一次GC时的ServiceFrom区。
老年代:
老年代主要存放应用程序中生命周期长的内存对象,老年代的对象比较稳定,所以MajorGC不会频繁执行,在进行MajorGC时一般要先进行MinorGC。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。
MajorGC采用标记清除法
首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC耗时比较长,因为要先扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般要进行合并或者标记出来使下次直接分配。当老年代也满了,装不下的时候,就会抛出 OOM(out of Menory)异常。
永久代:
指内存的永久保存区域,主要存放Class和Meta(元数据)区域,Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而膨胀,最终抛出OOM异常。
Java8与元数据:
在java8中,永久代已被移除,被一个称为元数据区(元空间)的区域所取代。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于,元空间并不存在虚拟机中,而是使用本地内存。因此在默认情况下,元空间的大小仅受本地内存限制。类的元数据放入nativememory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据不再由MaxPermSize控制,而由系统的实际可用空间来控制。
另外的几种垃圾回收算法
标记压缩法(老年代):标记压缩法在标记清除法上做了优化,把存活的对象压缩到一端,然后再进行GC
引用计数法:在Java中,引用和对象是有关联的,如果要操作对象则必须有引用进行。因此,很显然一个简单的方法是通过引用计数器来判断一个对象是否可以回收。简单说,即一个对象如果没有任何一个引用与之关联,即他们的引用计数都不为0,则说明对象不大可能再被用到,那么这个对象就可以回收。但主流的java虚拟机里都没有选用引用计数器算法来管理内存,最主要的原因是它很难解决对象直接相互循环引用的问题。
分代算法:根据对象的特点把内存分为N块,而后根据每个内存的特点使用不同的算法。
分区算法:其主要就是将内存分为N个小的独立空间,每个小空间都可以独立使用,独立回收,这样细粒度的控制一次回收一些小空间,而不是对整个空间进行GC,从而提升了性能,并减少GC的停顿时间。
JVM内存结构和垃圾回收算法相关推荐
- JVM内存结构、垃圾回收那点事
翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了 ...
- JVM内存结构和垃圾回收机制
目录 JVM内存结构 JVM内存分配机制 对象回收判断机制 引用计数法 可达性分析算法 垃圾回收算法 标记-复制 标记-清除 标记-整理 垃圾回收器 serial(-XX:+UseSerialGC - ...
- 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术
学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...
- 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
BAT必考JVM系列专题 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过 ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- 详解JVM内存管理与垃圾回收机制2 - 何为垃圾
随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...
- 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型
在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...
- Java内存结构与垃圾回收机制算法分析
什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...
- JVM内存模型与垃圾回收GC
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
最新文章
- 2019秦皇岛ccpc A题:Angle Beats[计算几何:统计符合直角三角形的个数]+[向量hash+3hash]
- 单一docker主机网络
- 【Java Web前端开发】深入浅出xml
- 初次使用Android Studio问题,Android Studio往项目中添加图片
- VTK:IO之DEMReader
- 怎么改HTML表单数据,form设置的数据怎么添加到table
- python创建虚拟环境报错typeerror_解决Python中报错TypeError: must be str, not bytes问题
- 生产环境MySQL 5.5.x单机多实例配置实践
- 合作活动 | 鲸准产业价值峰会AI专场,共探AI商业模式
- 用户名、密码都有值激活提交按钮
- CSS模拟实现色阶效果
- java带圈数字,小1,小2
- java 拼音识别_java 解析汉字拼音
- 安装python第三方模块包时,报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C
- 常见容错机制:failover、failfast、failback、failsafe
- 5miles:这家电商公司,想做推动区块链技术落地的标杆
- word文档替换技巧(空行替换、空格替换、软回车替换成硬回车)
- 金属塑性成形计算机模拟仿真,金属塑性成形计算机模拟的若干进展
- autoit3转换php,AutoIt3调用动态链接库DLL
- 嵌入式工程师常见C语言手写面试题,摘录于RTT内核源码