Java内存和垃圾回收

来源:互联网 发布:韩国直播软件app 编辑:程序博客网 时间:2024/05/16 14:19

概念

Java的堆内存分为三部分

  • 新生代(New Generation) – 新创建的对象(又分为S0,S1和Eden)
  • 旧生代 (Old Generation) – 经过多次垃圾回收没有被回收的对象或者大对象
  • 持久代 (Permanent Generation) – JVM使用的内存,包含类信息等

Java的垃圾回收分为两种

  • Minor GC

    回收新生代中的对象,代价低,速度快

  • Full GC

    回收旧生代和持久代中的对象,代价高,速度慢

配置

通过指定Java命令行参数可以改变内存和垃圾回收的行为。最常见的有

-Xmx1024m: 指定最大的堆大小为1024m

-Xms1024m: 指定初始化堆大小为1024m,设为跟最大的堆大小,可避免JVM动态调整

-XX:NewRatio=3: 指定新生代和旧生代的比例为1:3,比例越大,新生代越小,Minor GC调用越频繁,Full GC调用越不频繁。

-verbose:gc : 在控制台打印GC信息

-XX:+PrintGCDetails:显示更详细的GC信息

-Xloggc:gc.log :输出gc LOG到文件

工具

实时分析

图形界面:JVisualVM+VisualGC插件

JVisualVM是Java自带的工具,可以显示heap的变化趋势,更好的是通过visualgc这个插件来显示各个代的具体变化趋势。


命令行:jstat

jstat也是Java自带的一个分析工具。可以使用命令jstat –gcutil 来显示。

S0/S1/E/O/P-分别代表SO/S1/Eden/旧生代/永久代的大小

YGC/YGCT-代表minor gc的次数和时间

FGC/FGCT-代表full gc的次数和时间

    GCT-代表GC的时间

tip:Pid可以通过jps命令来查到

Dump分析

Dump分析适用于那些需要详细了解heap的分配情况,可以具体到哪个类

jmap+jhat/Eclipse Memory Analyzer

jmap用于dump heap信息到文件

jmap -dump:format=b,file=filename

jhat用于分析dump文件

jhat

默认启动在7000端口,可以用浏览器打开localhost:7000

Eclipse Memory Analyzer是Eclipse的一个插件,相当强大,推荐使用,可以帮你做leak analysis,注意的是它默认排除掉unreachable objects


编程

有时候,我们希望在自己的程序中检测当前memory的使用情况

堆检测

1
2
3
4
5
6
7
MemoryMXBean aMemoryMXBean=ManagementFactory.getMemoryMXBean();
 
MemoryUsage heapMemoryUsage=aMemoryMXBean.getHeapMemoryUsage();
 
usedHeapMemory = heapMemoryUsage.getUsed();
 
maxHeapMemory = heapMemoryUsage.getMax();

内存检测

1
2
3
4
5
freeMemory= Runtime.getRuntime().freeMemory();
 
totalMemory=Runtime.getRuntime().totalMemory();
 
maxMemory=Runtime.getRuntime().maxMemory();
0 0