jvm中运行时数据区和JMM

分类:知识要点 日期:2022-03-21 作者:yxy 浏览:1516

jvm中运行时数据区

方法区  堆  栈 本地方法栈 程序计数器

方法区

类型信息 域信息 方法信息  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或由转移指针给出下一条指令的地址。 此后经过分析指令,执行指令。

jvm参数配置

打印配置

-XX:+PrintCommandLineFlags:打印虚拟机默认参数

使用GC设置



-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: 

GC dump 配置

-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpBeforeFullGC 
-XX:HeapDumpPath=

JMM

java memory model 是一种抽象的概念,是一组规则或规范,JSR-133 规范,即 JavaTM内存模型与线程规范 

内存模型描述了该执行轨迹是否是该程序的一次合法执行。对于Java,内存模型检查执行轨迹中的每次读操作,然后根据特定规则,检验该读操作观察到的写是否合法
规定了一个线程的写操作何时会对另一个线程可见

java定义了线程,设计到内存共享,锁

顺序一致  Happens-Before  因果关系

double和long的非原子性处理

下载

JSR133中文版1.pdf

评论 (已有 3 条评论)

    Cc 2023-07-03 23:11回复

    [email protected]

    Cc 2023-07-03 23:11回复

    [email protected]

    Cc 2023-07-03 23:11回复

    [email protected]

发表评论

昵称:  
邮箱:  
网址: