jvm内存结构:
线程共享:堆,方法区
非线程共享: 虚拟机栈,本地方法栈,程序计数器
堆:所有的实例对象以及数组都要在堆上分配 ,从内存回收角度看: 细分为 新生代 和 老生代 是垃圾收集器管理的主要区域。
方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(jit)编译后的代码
内存回收的主要目标:针对常量池的回收和对类型的卸载 垃圾比较少回收这个区域。
string.intern()方法 注意(参考深入 理解java虚拟机)
虚拟机栈: 线程私有,生命周期与线程相同 为虚拟机执行java方法(字节码)服务
描述的是java方法执行的内存模型 :
每个方法被执行时同时会创建一个栈帧 用于存储局部变量表 、操作栈、动态链接、方法出口信息。方法被调用到执行完 对应着栈帧在虚拟机栈中从入栈到出栈的过程
本地方法栈:为虚拟机使用到的native方法服务
程序计数器:线程私有 当前线程所执行的字节码的行号指示器。记录正在执行的虚拟机字节码指令的地址。
jvm垃圾回收机制:
gc的基本原理:找到程序中不再被使用的对象,然后回收这些对象所占用的内存空间。
gc判断对象不再使用的算法:
对象存活判断算法:引用计数算法和根搜索算法
基本的垃圾回收算法:标记-清除、复制、标记-整理,分代收集算法
依赖线程实现的回收算法:串行、并行、并发
其中对象存活判定算法是其他算法的基石,用来判断对象是否存活,能否回收;基本的垃圾回收算法是垃圾垃圾收集器实现的基础算法;而依赖线程实现的算法,则是基本算法在考虑线程环境下的运用,这个有多线程基础的看名字就明白了。此外,还有综合以上算法并从特定角度实现的算法,如分代回收(针对分区)、增量回收(针对实时性)
内存分配和回收策略
1.对象优先在新生代 eden上分配
2.大对象直接进入老年代
3.长期存活的对象将进入老年代(动态对象年龄判定)