首页 > 代码库 > jvm知识小结
jvm知识小结
heap
- java的内存区称作堆(heap),用来保存类和对象
- heap被分为为3个称作域(generation)的主要部分,对应于对象不同的生存期
- 这三个generation分别为:新域(young generation),旧域(tenured generation),永久域(perm generation)
- 标记为virtual的部分被保留,在必要时才实际分配出去
- young generation由eden和两个救助空间survivor(from救助空间和to救助空间)组成
- eden用于生成新的对象,eden被充满时,收集器停止执行应用程序,将所有可到达的对象复制到当前的from救助空间
- 当from救助空间被充满时,收集器把可到达对象复制到当前的to救助空间
- 维持活动的对象将在救治空间中不断被复制,直到获得使用期转入旧域
- 需要survivor的原因:有一部分中长寿命的对象,复制小部分对象比压缩旧域廉价
- perm generation保存那些在jvm整个生存期都生存的对象,因此该generation不需要被垃圾回收器清空
- 在perm generation中一般存储类和方法对象,就配置而言不认为是heap的一部分
垃圾回收机制(GC)
- GC是jvm用于释放那些不再使用的对象的内存所占的内存的程序与算法
- 不是所有的jvm都有GC
- 为了标志对象是否被引用,有两种方法:引用计数、对象引用遍历
- 早期jvm多使用引用计数:当应用程序引用某一个对象时,增加引用数,当引用超出范围时,减少引用数。当某对象的引用数为0时,便进行垃圾回收
- 现在jvm多使用对象引用遍历:将对象引用关系构建成树,从一组根对象开始,递归对象进行marking,确定reachable对象,如果不是reachable对象,那这个对象就是要被回收的
- 删除不可到达对象时,有些jvm仅仅是删除没有标记的对象,并释放内存,这叫(sweeping)。但这会使内存分为好多小段,它们不足以生成新的对象。
- 因此,许多jvm会重新组织内存中的对象,并进行压缩(compact),形成可利用空间
- 为了内存空间的重新组织,jvm需要停止其它活动
- 有7种垃圾回收器,sun公司的jvm使用的是分代收集器
- 默认状态下,jvm在新域中使用复制收集器,对旧域使用标记-压缩-清除收集器
jvm配置
通常说的栈,是新域和旧域的和,可配置两个属性(s代表start,x代表max)
java -Xms128m java -Xmx128m 通常这两个相等,避免动态增加内存
设置新域大小(n代表new)
java -Xmn128m(新域的初始值和最大值都为128m) java -XX:NewSize 64m -XX:MaxNewSize=64m java -XX:NewRatio=3(新域与旧域比例3:1) 可用-XX:TargetSurvivorRatio控制救助空间比例。默认是50(50%),如救助空间是1m,那可用就是500k 若要禁止救助空间复制,对象从eden直接扩展到tenured generation,可把MaxTenureingThreshold设置成0 java -Xmn64m -XXSurvivorRadio=2(新域64m,eden32m,survivor各16m)
设置永久域大小
java -XX:MaxPerSize=64m java -xx:PerSize=64m(初始化永久域大小,默认是4m)
性能调优
- 注意使用对象的缓存,而不是建立新对象
- 一次完全的垃圾回收不应超过3-5秒,如果垃圾回收耗时太多,请减小heap
- 一般来说,使用物理内存的80%作为heap大小
- jvm虚拟机默认heap是64m
- java.lang.outOfMemoryError:java heap spacejvm中如果98%的时间是用于GC或者可用的heap不足2%抛出此异常
- 一般jvm的heap不超过物理内存的80%,Xms和Xmx设置为相同,Xmn为Xmx的四分之一
- -XX:+UseParNewGc设置并行处理器,缩短收集时间
jvm知识小结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。