JVM Memory Model And Garbage collector(一): 内存模型
2017-05-22 12:40
603 查看
JVM Memory Model And Garbage collector(一): 内存模型
这部分内容来自:Java 8 vm gctuning
memorymanagement-whitepaper-1-150020.pdf
前言:
以前只通过看thinking in java的时候了解过垃圾回收,但是那里只谈论到了初步的两种模式。对于真正的JVM没有详细了解。希望可以通过这两篇文章,对JVM的内存模型和垃圾回收建立一个清晰的认识。笔记内容目录:
内存模型垃圾回收器算法
Serail
Parallel
Concurrment Mark Swap(CMS)
Garbage-First(G1)
检查问题及性能调优(这里留个坑)
内存模型
在java中,内存的分配和回收都是不用编程人员关心的。由JVM进行处理。我们可以假设一下,如果我们要做这个垃圾回收的话,怎么做。最初的想法,肯定是把内存中的object遍历一遍,看是否存活,存活就留下,死了就释放。这是最简单的方法。但回收的时候要注意如果application并没有停下来的话,那么你检查的就可能不准。比如你扫某个object的是存活的,但是扫过的时候又死了,这样就会不准确。并且有一个问题,在垃圾回收的时候肯定要是分布的,不能再扫一个就做一次操作。这样做的时候,有两个不利:对内存的操作很频繁,增加了处理的复杂度;并且无法从统一的高度上去重新安排内存,从而造成内存碎片。所以不论在处理事情还是设计某个东西的时候,都是先认识、再识别分类处理。那么就可以对JVM的对象根据特点进行分类,大小、存活时间、类型。最后JVM选取分类的条件是大小、存活时间。对内存分成了两大块: Young 和 Tenured两类,其中Young又包括了Eden和两个survivor
为什么这么分?
上图是X轴是分配之后的byte存活时间,Y轴是存储时间的总字节数。从上图来看,young是占主要部分,并且会很快不再使用,只有少数部分会存活更久。
上图是具体的JVM分代图。
Eden(伊甸园): 这是object刚出生的地方,会在这里。
Survivor: 这是在对Young generation做清理的时候,在Eden中存活下来转移到这里。
Tenured: 这是Old generation,在Survivor经历几次垃圾回收会进来,然后还可能直接从Eden就进入(比较大的object)。
为什么需要两个Survivor?
One survivor space is empty at any time, and serves as the destination of any live objects in eden; the other survivor space is the destination during the next copying collection. Objects are copied between survivor spaces in this way until they are old enough to be tenured (copied to the tenured generation).
任何时间,都会有一个空的survivor空间。用来存储在收集的时候eden存活的对象。另外一个survivor是用来存储下一次存储存活的对象。对象在这两个suvivor空间里来回转存,直到他们变得足够久存放到tenured空间中。
也就是说: 当对Young进行回收的时候,会有一个empty的survivor。然后可以存储eden和另外一个survivor中存活的对象。之后清空另外一个survivor作为下一次存储Young的survivor的空间。这个有个图:
不是原图,在whitepaper中有一个原图,可以去看下.
相关文章推荐
- JVM(十)Java 内存模型(Java Memory Model,JMM)
- Java (JVM) Memory Model and Garbage Collection Monitoring Tuning
- Memory Consistency Model 内存一致性模型
- Getting started with JVM Memory model and GC
- JVM 内存模型和垃圾回收(五): Garbage-First
- Java 内存模型(Java Memory Model)
- Flat memory Model 平坦内存模型
- [翻译]内存一致性模型 --- memory consistency model
- 内存模型 (memory model)
- 深入理解JVM -- 内存模型及内存溢出(OOM/Out of Memory)
- Java Memory Architecture (Model), Garbage Collection and Memory Leaks
- JVM 内存模型和垃圾回收(四): 并发回收(Concurrent Mark-Sweep Collector)
- 内存模型 (memory model)
- jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space
- JVM内存模型和GC算法
- jvm内存模型
- 调优JVM内存,并解决OutOfMemoryError,StackOverflowError等异常问题
- JVM内存模型及垃圾收集
- 【转】jvm 内存模型及内存调优
- JVM内存模型以及垃圾回收