欢迎使用CSDN-markdown编辑器

来源:互联网 发布:中国经济实力 知乎 编辑:程序博客网 时间:2024/06/06 18:51

JVM队内存学习

1:JVM的堆内存分为两块,Permanent Space (持久化) Heap Space。
1.1Permanent 是持久化,主要用来存储静态类型数据,Java calss、method等。持久化堆垃圾回收没有什么影响
1.2 Heap Space 分为年老代、年轻代。
1.2.1 年轻代:分为Eden、from、to。
所有的新对象都首先放在年轻代,年轻代的目标就是尽快回收掉生命周期比较短的对象。
大部分对象在Eden区中生成,当Eden区满了以后,把没被垃圾回收的对象放到Survivor中(Sruvivior就是前面提到的from、to,一般有两个用于交换,也可以有多个)当一个Sruvivor满了以后from当前的区to另一个Survivor,这个区也可以把直接从Eden中过来的对象放到另一个Sruvivior中。当这个区也满了,就把还活着的对象复制到年老代。
清理年轻代内存的垃圾回收叫做Young GC。
1.2.2 年老代:经历了年轻代的几次垃圾(可以通过JVM的参数来配置)回收后还时活性的对象就是生命周期比较长的对象。
年老代使用的垃圾回收 Full GC。
1.3堆内存的申请过程
当一组对象被声明后,JVM首先在Eden中申请内存空间。
Eden中内存不够,调用Young GC 释放内存,内存依然不够。
把没有被清理的对象复制到Survivior区,内存不够,调用垃圾回收期回收内存还是不够,把清理后依然存活的对象复制到另一个Survivior区,当然还是不够了,还是需要调用GC释放内存,依然不够。
年轻代的生命周期比较长的对象复制到年老代,如果年老代在调用了Full GC后还是无法有足够的内存来放置年轻代的对象,就出现我们需要了解的一个问题——内存溢出”Out Of Menory”
2:OOM “Out Of Menory” 内存溢出
2.1 年老代溢出:java.lang.OutOfMenoryError:JavaHeapSpace
原因:内存参数过小、内存使用不当
解决办法:前者就是把参数调大。后者具体的表现有:
2.1.1
循环上万次的字符串处理。
创建上万个对象。
在一段代码内申请上百M或者G的内存。
系统不间断的垃圾回收,无法处理其他的请求(MAT工具分析)
2.2 持久代溢出
因为持久代主要存储静态类型数据,所以当一个应用动态调用大量的java class,也可能造成内存溢出的问题。可以把部分Java类放到容器共享区去加载。
3 垃圾回收器
3.1串行收集器:只能处理小数据量,在生产中几乎不使用。JDK5.0以前是默认使用串行收集器。
3.2并行收集器:侧重于吞吐量优先。
3.3并发收集器:响应时间优先。

原创粉丝点击