- 传统程序语言:由程序员手动内存管理
- 现代程序语言:自动内存管理
根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代
1.Young (新生代)
新生代 分为三部分。Eden区(new 的对象)和两个大小相同的Survivior区(某一时刻,只有一个被使用),另外一个,当Eden区满了,GC就会将存活的对象移动到空闲的Survivor区,根据JVM的策略,在经过几次垃圾收集后,依然存活在Survivor区的对象,将移动到Tenured区(老年代)
2.Tenured(老年代)
老年代 主要保存生命周期长的对象。(new 的大对象,会直接进入老年代)
3.Perm(永久代)
永久代主要保存class、method、filed对象。这部分的空间一般不会溢出,除非一次性加载很多的类,不过在涉及热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError:PermGen space的错误
4.Virtual区:
最大内存和初始内存的差值,就是Virtual区
This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation
- 共享,内存大户,存储所有的对象和数组
- -Xms 初始堆值,-Xmx最大堆值
- 使用jstat命令
jstat -class pid # 查看加载的类
jstat -gc pid # 查看垃圾回收情况
- jmap命令
jmap -histo pid # 查看所有对象
jmap -histo:live pid # 查看所有存活对象
jmap -dump:format=b,file=filename pid # 导出dump文件
- jhat分析dump文件
- JDK9以后不再提供,被Visual VM代替
jhat filename
- mat分析
- 添加运行参数
java -Xmx8m -Xms8m -XX:+HeapDumpOnOutOfMemoryError
- 分析dump文件
jstack pid
- 死锁
两个进程互相等待对方,一直阻塞下去
Found one Java-level deadlock:
=============================
"Thread-0":
waiting to lock monitor 0x000002292014eb00 (object 0x00000000ffea7640, a java.lang.Object),
which is held by "Thread-1"
"Thread-1":
waiting to lock monitor 0x000002292014ea00 (object 0x00000000ffea7630, a java.lang.Object),
which is held by "Thread-0"
Java stack information for the threads listed above:
===================================================
"Thread-0":
at Main.lambda$main$0(Main.java:24)
- waiting to lock <0x00000000ffea7640> (a java.lang.Object)
- locked <0x00000000ffea7630> (a java.lang.Object)
at Main$$Lambda$14/0x0000000800ba4840.run(Unknown Source)
at java.lang.Thread.run(java.base@13/Thread.java:830)
"Thread-1":
at Main.lambda$main$1(Main.java:37)
- waiting to lock <0x00000000ffea7630> (a java.lang.Object)
- locked <0x00000000ffea7640> (a java.lang.Object)
at Main$$Lambda$15/0x0000000800ba4c40.run(Unknown Source)
at java.lang.Thread.run(java.base@13/Thread.java:830)
Found 1 deadlock.
- 线程私有,存储类中每个方法的内容
- -Xss 最大栈值
- 存储类信息、常量池等
- 1.7及以前,永久区(Perm),-XX:PermSize, -XX:MaxPermSize
- 1.8及以后,元数据区,-XX:MetaspaceSize, -XX:MaxMetaspaceSize
MX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理
- 使用visualvm进行可以对上述的大部分操作可视化