什么是java内存管理?
首先jvm的运行时数据区域可以划分为堆,栈,方法区,程序计数器。栈又分为虚拟机栈和本地方法栈。
虚拟机栈中存放栈帧,每一个栈帧中存有局部变量表,操作数栈,动态连接等信息,java方法从开始到结束代表着栈帧的一次入栈出栈操作。本地方法栈是为native方法服务的。
程序计数器:当前线程执行字节码时的行号指示器。
堆:用来存放数组和实例化的对象。
方法区:用来存储类信息,final常量,static静态变量,即时编译器编译的代码等,其中还包括运行时常量池,用来存放字面量和符号引用。
其中堆内存比较重要,可能发生的问题是内存泄露或者是内存溢出。内存泄漏是指GC没有回收掉废弃对象导致一直占用空间。内存溢出是指堆内存已满。
垃圾回收策略:
引用计数法,可达性分析法。
标记清除算法,标记整理算法,复制算法,分代算法。
永久代的GC主要回收废弃变量和无用的类。
分代的原因是提高GC性能
每一次GC,90%的对象被回收
根据对象寿命可以分为新生代和老年代。新生代表示对象生命周期短,被回收几率高,主要是Minor GC,老年代表示对象寿命周期长,回收几率低。新生态中主要使用复制算法,老年代主要使用标记清除或标记整理算法。
新生代还可以分为Eden和Survivor区域。一块Eden和两块Survivor。复制算法的一种改进。
问题是为何要设置一个eden区域和两个survivor?假如不设置survivor区域,那么eden区域会频繁进行minor GC,如果有对象在15次GC后活下来,就会进入老年代。那也就是说随着时间推移老年代中的对象越来越多,最终导致fullGC,由于fullGC消耗时间长,会导致系统响应速度。所以存在survivor的意义就是减少老年代中的对象,间接减少fullGC的频率。
虚拟机每次使用 Eden 和 其中一块 Survivor。如果这两个区域满了,发送一次MinorGC,那么就会把存活的对象放入第二块Surivior中,当第二块空间不够时,会将对象放入老年代。
JVM内存管理
最新推荐文章于 2024-07-03 13:40:25 发布