1. 减少内存使用1.1. 减少堆内存的使用1.1.1. 使用更少的内存意味着堆被填满的频率会降低,需要的GC周期会更少,其效果也可以成倍增强1.1.2. 更少的新生代回收意味着对象的晋升年龄增加的频率降低1.1.3. 对象晋升到老年代的可能性也降低了1.1.4. FullGC周期(或者并发GC周期)的数量将减少1.2. 方法1.2.1. 减小对象大小1.2.2. 使用对象的延迟初始化1.2.3. 使用标准化对象2. 减小对象大小2.1. 可以提高GC的效率2.2. 即使实例变量是null,也会消耗对象类内的空间2.3. 让对象更小2.3.1. 不太可能将堆的大小增加10%2.3.2. 将堆中
1. 减少内存使用1.1. 减少堆内存的使用1.1.1. 使用更少的内存意味着堆被填满的频率会降低,需要的GC周期会更少,其效果也可以成倍增强1.1.2. 更少的新生代回收意味着对象的晋升年龄增加的频率降低1.1.3. 对象晋升到老年代的可能性也降低了1.1.4. FullGC周期(或者并发GC周期)的数量将减少1.2. 方法1.2.1. 减小对象大小1.2.2. 使用对象的延迟初始化1.2.3. 使用标准化对象2. 减小对象大小2.1. 可以提高GC的效率2.2. 即使实例变量是null,也会消耗对象类内的空间2.3. 让对象更小2.3.1. 不太可能将堆的大小增加10%2.3.2. 将堆中
1. 对象重用1.1. 原因1.1.1. 许多对象的初始化成本很高,权衡了增加的GC时间之后,还是重用对象的效率更高1.2. 只适用于初始化成本很高且数量较少的一组对象1.2.1. 被重用的对象会在堆中停留很长时间。如果堆中有大量对象,创建新对象的空间就更少了,因此GC操作会更频繁。1.3. 方式1.3.1. 对象池1.3.1.1. 线程池化可以节省创建线程的时间1.3.1.2. 在池中有少量对象并不会对GC效率产生太大影响,但堆中充满池化对象时会大大减慢GC的速度1.3.2. 线程局部变量1.3.2.1. 随机数生成器作为线程局部变量,可以节省使用随机数种子创建生成器所需的时间1.4. 特点
1. 对象重用1.1. 原因1.1.1. 许多对象的初始化成本很高,权衡了增加的GC时间之后,还是重用对象的效率更高1.2. 只适用于初始化成本很高且数量较少的一组对象1.2.1. 被重用的对象会在堆中停留很长时间。如果堆中有大量对象,创建新对象的空间就更少了,因此GC操作会更频繁。1.3. 方式1.3.1. 对象池1.3.1.1. 线程池化可以节省创建线程的时间1.3.1.2. 在池中有少量对象并不会对GC效率产生太大影响,但堆中充满池化对象时会大大减慢GC的速度1.3.2. 线程局部变量1.3.2.1. 随机数生成器作为线程局部变量,可以节省使用随机数种子创建生成器所需的时间1.4. 特点
1. 垃圾回收器1.1. 对象可以在被需要时创建,不再使用时由JVM自动回收1.2. GC是查找不再使用的对象,然后回收这些对象相关内存的过程1.2.1. 找到不使用的对象、回收其内存、压缩堆内存1.3. 优化垃圾回收器比跟踪指针引起的bug要容易得多(且耗时更少)1.4. VM必须定期搜索堆中不使用的对象1.4.1. 从GC根(GCroot)对象开始搜索,GC根是可以从堆外被访问的对象,主要包括线程栈和系统类1.4.2. 当GC算法找到不使用的对象时,JVM会回收这些对象占用的内存,并将这些内存分配给其他对象2. 垃圾回收器运行多个线程2.1. 一组执行应用程序逻辑,通常被称为mutator
1. 垃圾回收器1.1. 对象可以在被需要时创建,不再使用时由JVM自动回收1.2. GC是查找不再使用的对象,然后回收这些对象相关内存的过程1.2.1. 找到不使用的对象、回收其内存、压缩堆内存1.3. 优化垃圾回收器比跟踪指针引起的bug要容易得多(且耗时更少)1.4. VM必须定期搜索堆中不使用的对象1.4.1. 从GC根(GCroot)对象开始搜索,GC根是可以从堆外被访问的对象,主要包括线程栈和系统类1.4.2. 当GC算法找到不使用的对象时,JVM会回收这些对象占用的内存,并将这些内存分配给其他对象2. 垃圾回收器运行多个线程2.1. 一组执行应用程序逻辑,通常被称为mutator
1. GC触发条件1.1. 当新生代满的时候1.1.1. MinorGC会被触发1.2. 当老年代满的时候1.2.1. FullGC会被触发1.3. 当堆快要填满时1.3.1. 并发GC(如果适用)会被触发2. 强制开启GC2.1. System.gc()方法2.1.1. 总是会触发FullGC(即使JVM运行的是G1GC或者CMS)2.1.2. 并不会让应用程序更高效2.1.2.1. 只是让GC比其他情况更早开启,也只是将性能的影响延迟了2.1.3. 调用这个方法从来都不是好主意2.2. 例外2.2.1. 在做性能监控或基准测试时2.2.1.1. 对于运行少量代码的小型基准测试,为了加快预热
1. GC触发条件1.1. 当新生代满的时候1.1.1. MinorGC会被触发1.2. 当老年代满的时候1.2.1. FullGC会被触发1.3. 当堆快要填满时1.3.1. 并发GC(如果适用)会被触发2. 强制开启GC2.1. System.gc()方法2.1.1. 总是会触发FullGC(即使JVM运行的是G1GC或者CMS)2.1.2. 并不会让应用程序更高效2.1.2.1. 只是让GC比其他情况更早开启,也只是将性能的影响延迟了2.1.3. 调用这个方法从来都不是好主意2.2. 例外2.2.1. 在做性能监控或基准测试时2.2.1.1. 对于运行少量代码的小型基准测试,为了加快预热
1. 调整堆的大小1.1. 随着堆的大小增加,停顿的持续时间也会增加1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能1.3. 操作系统进行的交换对JVM是不公开的1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作1.4. 首要规则是设定堆的大小永远不要超过机器的物理内存1.4.1. 如果有多个JVM在运行,那么这适用于所有堆的总和1.5. -XmsN标志1.5.1. 初始值1.6. -XmxN标志1.6.1. 最大值1.7. 默认值1.7.2. 在物理内存小于192MB的机器上,堆的最大值会是物理内存的一半(96MB或更少)1.8. 如果JVM发现堆在
1. 调整堆的大小1.1. 随着堆的大小增加,停顿的持续时间也会增加1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能1.3. 操作系统进行的交换对JVM是不公开的1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作1.4. 首要规则是设定堆的大小永远不要超过机器的物理内存1.4.1. 如果有多个JVM在运行,那么这适用于所有堆的总和1.5. -XmsN标志1.5.1. 初始值1.6. -XmxN标志1.6.1. 最大值1.7. 默认值1.7.2. 在物理内存小于192MB的机器上,堆的最大值会是物理内存的一半(96MB或更少)1.8. 如果JVM发现堆在