JVM
2021-03-23 21:30:44 10 举报
登录查看完整内容
JVM入门
作者其他创作
大纲/内容
没有内存碎片(好处),但每次的to区都是空的,就浪费内存空间(坏处)
old
2
to区一定是空的,以留待用每次进来都在to区,所以每一次执行后,from区和to区会交换位置,或者说to 区一定要是空的,你数据进来,我to区不就不空了,不空了我就变from区,你原来from中的数据就复制过来,原来的from就变成新to区
标记
...
连续内存空间
新生区
经过一次GC
对象A(2)
3. 标记清除算法
总结:内存效率:复制算法 > 标记清除算法 > 标记整理算法 (时间复杂度)内存整齐度:复制算法 = 标记整理算法 > 标记清除算法内存利用率:标记整理算法 = 标记清除算法 > 复制算法
GC引用计数
大小:eden:s0:s1=8:1:1
重GC 垃圾回收
持久代| 元空间 |方法区Perm
轻GC和重GC执行后,内存不够,则导致java.lang.OutOfMemoryError(OOM)
本地变量表
Java栈
清除:未被标记的对象,清除(不是黄色的)
对象A(0)
Class Loader类加载器子系统
幸存区from
有啥用
本地方法栈Native method stack
幸存0区
伊甸园
堆
执行引擎
对象存活率低的人用,如Eden区
对象类型数据
缺点:效率比较低,需要停止应用程序,这回导致用户体验差有内存碎片
对象A(1)
本地方法接口Native Method Inteface
幸存区to
eden
原来就存活的对象
4.标记压缩
老年代
1.引用计数法
java栈Stack
2. 复制算法
用通俗的话解释一下 标记/清除算法,就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将依旧存活的对象标记一遍,最终再将堆中所有没被标记的对象全部清除掉,接下来便让程序恢复运行。
养老区
谁用
S1
堆heap
方法区
Class File
栈、堆、方法区之间的关系
1
本地方法库
永久存储区
每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次,则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。目前虚拟机基本都是采用可达性算法,从GC Roots 作为起点开始搜索,那么整个连通图中的对象边都是活对象,对于GC Roots 无法到达的对象变成了垃圾回收对象,随时可被GC回收。
方法区 Method Area
JDK 1.7 以前堆
轻GC 垃圾回收
别名Non-Heap 非堆
对象实例数据
伊甸园区(Eden Space)
引用reference
存活的对象
GC四大算法
下一次进来的数据会到to区
堆空间
幸存1区
JDK1.8 后
GC 回收
老年代一般是由标记清除或者是标记清除与标记整理的混合实现
Jdk1.6之前: 有永久代,常量池1.6在方法区Jdk1.7: 有永久代,但是已经逐步 “去永久代”,常量池1.7在堆Jdk1.8及之后:无永久代,常量池1.8在元空间
在整理压缩阶段,不再对标记的对象作回收,而是通过所有存活对象都像一端移动,然后直接清除边界以外的内存。
出现OOM的原因:1、Java虚拟机的堆内存设置不够,可以通过参数 -Xms(初始值大小),-Xmx(最大大小)来调整。2、代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)或者死循环
S0
运行时数据区 Runtime Data Area
程序计数器(PC)
JVM体系结构
对于HotSpot虚拟机,很多开发者习惯将方法区称之为 “永久代(Parmanent Gen)”,但严格本质上说两者不同,或者说使用永久代实现方法区而已,永久代是方法区(相当于是一个接口interface)的一个实现,Jdk1.7的版本中,已经将原本放在永久代的字符串常量池移走。
新生代
0 条评论
回复 删除
下一页