JVM基础知识

一、JVM内存结构及内存管理基础知识
内存(堆、栈)
堆内存:存储的单位
栈内存:运行时单位
栈→线程栈(栈帧、帧)→JAVA方法调用的状态 栈负责控制java程序运行中的进程和程序处理逻辑
栈帧:(局部变量区、操作数栈、帧数据区)
局部变量区:存储对应方法的参数和局部变量
操作数栈:相当于寄存器,存储虚拟机的程序指令
帧数据区:除了局部变量和操作数栈中的数据外,java帧栈还需要一些数据来支持常量池解析,正常方法返回以及异常派发机制,这些信息都是报存在帧数据区中。
栈:只能存储基本类型的数据和对堆中对象的引用。java栈上的数据都是此线程私有的,任何线程都不能访问另外一个线程的栈数据。
堆:所有线程共享
栈优势:存取速度比堆快,仅次于寄存器,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
栈大小:通过-Xss来设置,java.lang.StackOverfiowError
1.java内存结构
初始分配内存:-Xms,默认是物理内存的1/64
最大分配内存:-Xmx,默认是物理内存的1/4
服务器一般设置-Xms,Xmx相等,以避免每次GC后调整堆的大小;对象的堆内存又称为垃圾回收器的自动内存管理系统回收。
GC:垃圾回收
1)堆内存划分
年轻代(Young Generation):-Xmn (Eden+s0+s1) 伊甸园区+存活区1+存活区2
伊甸园区(Eden):存放新生的对象,隶属于年轻代,可以由 -XX servivorRatio设定年轻代Eden区与Survivor区的大小比值
存活区(Servivor Space):有两个,存放每次Eden区垃圾回收后存活的对象
老年代(Old Generation):老年代,也叫Tenured Gerenration,主要存放应用程序中生命周期长的存活对象,-Xmx -Xmn 最大分配内存—年轻代堆内存大小

-XX:NewRatio(设置老年代与年轻代的比值)
2)非堆内存分配
-XX:PermSize:设置非堆内存的初始值,默认是物理内存的1/64

-XX:Max-permSize:设置最大非内存的大小,默认是物理内存的1/4
Permanent Generation:保存虚拟机自己的静态数据,主要加载的class类级别静态对象,如class本身、method、filed等。Permanent Generation空间不足会引发full GC
Code Cache:用于编译和保存本地代码的内存
FGC:当old空间不够时,JVM 会在Old区进行major Collection,也就是Full GC(对整个堆进行垃圾清理,包括年轻代,老年代和持久代,因为对整个堆清理,所以时间比较长,应尽量减少FGC的次数)
YGC :Eden空间不足
2.JVM内存管理
栈空间:基础数据类型、方法的形式参数、直接在栈空间分配,方法调用完成后,从栈空间回收。引用数据类型:栈空间分配地址,堆空间分配对象的类变量
JVM内存申请过程
Eden→Servivor0→Survivor1→存货去切换次数→Old(切换次数:-XX MaxTenurningThreshold) 大于该值进入老年代
垃圾完全收集后,若Servivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则会出现“Out of memory”
3.JVM垃圾回收机制
1)垃圾回收期主要负载任务
分配内存
确保被引用对象的内存不被错误回收
回收不再被引用对象的内存空间
2)目前JVM都采用分代收集
a)串型收集(适合单处理器)
b)并行收集(适合多处理器)
c)并发收集(适合对响应时间要求比较高的中、大规模应用,可使用 -XX UseConcMarkSweepGC打开并发收集器)

你可能感兴趣的:(java)