JVM内存划分和GC机制

最近看了有关Java虚拟机(Java Virtual Machine)的内存划分的资料。整理一下。

一、数据存储初识:
三种常见的数据存储方式:(三者都位于RAM中,有区别)
* RAM: Random Access Memory随机存储器
这里写图片描述
三者的区别:
1) Stack是通过“堆栈指针”来获取处理器的直接支持。
堆栈指针向下移动,会创建新的内存。
堆栈指针向上移动,会释放一些内存。
这种存储方式的优点:
a. 存储速度快,仅次于CPU寄存器。
b. Java编译器必须知道要保存的数据的长度以及存在时间
缺点:
a. 限制了程序的灵活性
b. 一般Java对象的引用储存在其中,而对象不存储在其中。
2) Heap
相比于Stack优点:
a. 编译器既无需知晓数据的存在时间(数据要保留多久),又无需知晓数据的大小(数据所需的存储空间)
b. 在创建对象时,只需要使用new命令即可
缺点:
在堆中分配存储控件会花费更多的时间,这是Java的性能不佳的重要原因之一。
3) Static 是用static关键字修饰的,静态存储的位置固定的,有且只有一份。在程序运行时可以随时被调用。

二、JVM中的数据存储机制和C++中的存储机制的对比。
在C++中,对象是可以在堆栈(Stack)中创建的。堆栈的特点是要求给定要存储数据的大小、存留时间长短。这种存储方式具有Stack的所有优点和缺点。如果,将C++对象(又称为结构体)存储在创建的”内存堆(Heap)”中,速度会慢很多。
下面以C++内存堆类比Java堆:
* 这种C++内存堆是一个大的内存池,要求必须进行循环使用。
可以把C++的内存堆(Heap)看做一块场地。在这块场地内,每个对象不断的监视自己的地盘,它们可能在某个时间不在占用所占有的控件,即被释放,留下了一个空白区域,下次要存储别的新对象时,先要从整个存储区(场地)中找出空白区,然后存放进去。(内存搜索费时费力!!!)

三、分代方式管理堆
由于内存搜索性能低下,为了缓解这个问题,SUN采用的是分代管理堆内存。这是一种分区域管理(类似于图书馆的分类管理方法),来减小要扫描的区域,以提高性能的方法。
基本原理:
1. 分代管理中,代分为年轻代、年老代
2. 年轻代分为三个区:一个Eden区(又称为from),两个Survivor区(又称为to)
3. 一般情况下,新创建的对象会被分配到Eden区(一些大对象会做特殊处理)。这些对象经过第一次Minor GC后,存活着的对象将会移动到Survivor区。此时此对象的年龄增长1岁(每通过一次Minor GC后存活下来年龄就增长1岁),年龄增长到一定程度后(>=n),此对象就会被移动到年老代。
4. 通过Minor GC死去的对象即被释放的对象将会被作为垃圾回收。
* 注:因为年轻代中80%的对象基本上是”朝生暮死”,所以年轻代中的垃圾回收算法是复制算法。
步骤图示:
首次创建对象:
这里写图片描述
第一次Minor GC
这里写图片描述
第二次Minor GC
这里写图片描述
若干次Minor GC后
这里写图片描述

关于复制算法:
基本思想:将内存一分为二。先用其中一半,当这一半存满后,检查其中存活的,复制到另一半,清空此半部分。此种算法不会产生碎片。
其他主要的几种算法:
(1).Tracing算法与Compat算法
Trancing算法是一种追踪标记算法。用于追踪和标记活动对象。在所有标记结束后,开始清除过程。清除死去的对象后,存储区变成了一个不连续的区域,此时使用Compat算法,将活动的象移动到一起,连续排列。
(2).Generational算法
主要是针对Copy算法多次复制长时间存活的对象进行了优化,缺点是程序有停顿。
(3).Adapter算法

四、Android Studio中的配置(gradle.properties)
1.JVM运行时堆的大小设置:
-Xms 堆的最小值
-Xmx 堆的最大值
2.年轻代堆控件大小设置
-XX:NewSize 年轻代堆最小值
-XX:MaxNewSize 年轻代堆最大值
-XX:NewRadio 年轻代堆在堆中所占的比率
-XX:SurvivorRadio 年轻代堆中Survivor所占的比率
3.永久代大小设置
-XX:MaxPermSize
4.年老代的最小年龄(年轻代的最大年龄,用来区分一个存活对象是否进入年老代)
-XX:MaxTemuringThreshold

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值