分类:知识要点 日期:2022-03-21 作者:yxy 浏览:1650
方法区 堆 栈 本地方法栈 程序计数器
类型信息 域信息 方法信息 JIT代码缓存 静态变量 StringTable(字符串常量池) 运行时常量池
jdk7 将方法区改为永久代 静态变量 StringTable移入堆中
jdk8 将方法区改为mataspace(元空间)
新生代,老年代
新生代分为Eden 空间、From Survivor 空间(s0)、To Survivor 空间(s1)
-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最小空间大小。
XX:+UseParallelGC 使用ParallelGC
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
# 启动打印所有的jvm flag参数配置
-XX:+PrintCommandLineFlags
#堆大小
-XX:InitialHeapSize=1024m -XX:MaxHeapSize=2048m 与 -Xms128m -Xmx2048m 类似
#年轻代大小
-XX:NewSize=512m,-XX:MaxNewSize=512m
#老年代等于堆大小减去年轻代大小
-XX:NewRatio=4:年老代:年轻代=4:1,默认值2
-XX:SurvivorRatio=8:年轻代中,2个Survivor区与1个Eden区比例=2:8,Survivor占新生代内存比例为1/5,默认值8 ,直接设置这个不会生效,必须和-XX:-UseAdaptiveSizePolicy 同时设置
每个线程一个栈 ,独立互不影响, -Xss128k 与 -XXThreadStackSize=128k 一致
栈是后进先出的内存结构
栈里面的是栈帧,每个方法进入则产生一个栈帧
栈帧包含 局部变量表,操作数栈,方法返回地址,动态链接
局部变量表的大小和字段在jvm 加载class文件就解析好了 locals
操作数栈深度大小也已经定好 stacks
方法返回地址,
动态链接(class文件常量池中符号引用)
方法条用深度太深 也会内存溢出,
StackOverflowError
Java虚拟机栈于管理Java方法的调用,而本地方法栈(Native Method Stack)用于管理本地方法的调用。 本地方法栈,也是线程私有的。 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常
程序计数器是用于存放下一条指令所在单元的地址的地方。 当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。 与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。 此后经过分析指令,执行指令。
-XX:+PrintCommandLineFlags:打印虚拟机默认参数
-XX:+UseSerialGC:使用Serial垃圾收集器,单线程串型收集器(client模式默认垃圾收集器)
-XX:+UseParNewGC: Serial收集器的多线程升级版
-XX:+UseParallelGC:使用Parallel垃圾收集器(JDK1.8默认收集器),优点吞吐量高
-XX:+UseConcMarkSweepGC:使用CMS垃圾收集器,优点低延迟
-XX:+UseG1GC:使用G1垃圾回收器(新一代,重点关注),优点低延迟
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
G1 相关配置
设置最大GC 暂停时间。这是一个大概值,JVM 会尽可能的满足此值
-XX:MaxGCPauseMillis=n
设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。默认值 45.
XX:InitiatingHeapOccupancyPercent=n
对象晋升年代的最大阀值。默认值 15.这个参数需要注意的是:最大值是15,原因为:JVM内部使用 4 bit (1111)来表示这个数。
-XX:MaxTenuringThreshold=15
设置Region大小
-XX:G1HeapRegionSize=n:
-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpBeforeFullGC
-XX:HeapDumpPath=
java memory model 是一种抽象的概念,是一组规则或规范,JSR-133 规范,即 JavaTM内存模型与线程规范
内存模型描述了该执行轨迹是否是该程序的一次合法执行。对于Java,内存模型检查执行轨迹中的每次读操作,然后根据特定规则,检验该读操作观察到的写是否合法
规定了一个线程的写操作何时会对另一个线程可见
java定义了线程,设计到内存共享,锁
顺序一致 Happens-Before 因果关系
double和long的非原子性处理
[email protected]
[email protected]
[email protected]