阅读更多
运行时数据区
program counter register 程序计数器
java方法 存 正在执行的字节码指令地址 native方法 为空undefined
每个线程有一个独立的
规范没有规定ooM
vm stack
线程私有
一个方法有一个stack frame 存局部变量 操作数栈 动态链接 方法出口 方法调用 压栈 出栈
如果线程请求的栈深度大于虚拟机允许的 stackoverflowerror
如果vm stack可以动态扩展 扩展时无法申请到足够的内存 OOM
private static void oom(int i){
while(i>1){
oom(i);
}
}
public static void main(String[] args) {
oom(2); //28592 call
}
native method stack
对应native方法
也会sof oom
java heap
线程共享
存 对象实例
新生代 老生代 survior
线程私有的分配缓冲区 thread local allocation buffer
没有内存完成实例分配 并且无法扩展 OOM -Xmx -Xms
method area 方法区
线程共享
类信息 常量 静态变量 (字符串常量池 永久代)
hotspot 永久代实现方法区(省去为方法区写内存管理) permanent generation
-XX:MaxPermSize
OOM
运行时常量池runtime constant pool
class文件常量池 运行期也可以放进去 string.intern()
导致OOM
direct memory
nio 使用时分配
导致内存区域总和大于物理内存限制 动态扩展时出现OOM
对象的内存布局
header hashcode gc分代 锁状态
instance data
padding 占位符
栈容量 -Xss
每个线程分配栈容量 线程太多可能导致内存不够 栈内存OOM
OOM Error message
Java heap space
unable to create new native thread
PermGen space //动态生成大量class 大量jsp osgi
diect memory //dump文件很小 nio
GC
引用计数 无法回收循环引用
可达性分析 GC Roots 可达到的对象
引用 不等于必要, 解决方法: 强引用 软引用 弱引用 虚引用
finalize方法只会被调用一次 下次GC不会调用
永生代 常量池回收 无用类回收
垃圾收集算法
标记-清除算法
效率问题
内存碎片问题
复制算法
内存变为原来一半
商业虚拟机用此算法回收新生代
标记-整理算法
对老生代使用
存活对象向一端移动
分代收集算法
根据分代使用以上几种算法
内存分配
小对象直接进入eden
大对象(需要大量连续内存空间,很长的字符串及数组) 避免经常出现短命的大对象提前触发GC
新对象进入eden,熬过一次Minor GC进入survivor,age设为1,到15岁后进入老生代
动态年龄判定
线程快照
threaddump/javacore
堆转储快照
headdump/hprof
jvm监控命令
jps
jinfo
jstat -gcutil vmid
jmap 堆快照 -heap -histo
jhat 分析堆快照文件
jstack 线程快照
jconsole
visualVM
heap analyzer
memory analyzer tool
class loader
任一个类 由类加载器和类本身 确立其在JVM中的唯一性
从JVM看 2种类加载器
C++实现的bootstrap classloader, JVM的一部分
java实现的其他加载器, JVM外部
java开发人员看
bootstrap 加载JAVA_HOME/lib下的
extension 加载JAVA_HOME/lib/ext下的
application 加载classpath下的
类加载器的层次用组合实现
加载类的时候首先委托父类,父类没法再自己加载
不是所有都是这样, jndi等spi、OSGi不是
GC性能指标
throughput GC花的时间越少,系统计算吞吐量越大 //适用于后台非实时计算
pause time stop the world时间// 实时交互系统很看重,如网站
frequency 频率
footprint a measure of size, such as heap size
promptness 对象成为垃圾到对象内存重新变为可用的时间间隔
GC设计抉择
串行 并行
并发 stop the world
压缩 不压缩 复制
behavior-based tuning
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n