JVM|JVM - 运行时数据区
1,JVM运行时数据区
2,栈帧
文章图片
image.png
1)线程私有区域
pc:程序计数器,当前线程将要执行的下一条jvm指令地址。
本地方法栈:每个线程独立独有,调用native方法时使用。
虚拟机栈:每个线程独有,存储栈帧,方法调用时入栈,结束时出栈。
2)线程共享区域
Heap堆:分为s0、s1、eden、old等。几乎所有的对象实例。通过-Xms、-Xmx指定堆大小。
方法区:存储被JVM加载的元数据。类信息(字段、方法)、常量、静态变量等。
运行时常量池:属于方法区,包含字面量(字符串、final常量)、符号引用。
3)直接内存
不属于JVM运行时数据区,JVM的NIO方法可以分配堆外内存如使用DirectByteBuffer。
【JVM|JVM - 运行时数据区】
1)栈帧:3,方法区包含局部变量表、操作数栈、动态链接、返回地址。
文章图片
image.png
2)方法调用:可以看做栈帧在虚拟机栈中从入栈到出栈的过程。
参数过多:栈帧中局部变量表过大,该栈帧深度过大。可以将参数列表使用对象封装。
3)局部变量:方法执行过程中需要的全部变量。包含指向当前对象this的引用、方法的参数、其他局部定义变量。
静态方法:0位置从参数列表存储。
实例方法:0位置存储当前对象this的引用。
4)方法调用的底层表示:
jvm调用实例方法时,会将对象引用作为第一个参数传递给方法(局部变量表0位置的this)。如:a.halo("hello"); => Halo.halo(a, "hello")
jvm调用静态方法,Halo.staticHalo("static halo"); 在static方法内部,不能直接调用非static的方法。
1)Method Area4,堆包含已加载的类信息
JDK1.7以后,常量池移至堆中。
方法区类信息中包含指向堆中Class实例的引用。
文章图片
image.png
2)类的方法信息
每个栈帧分配多少内存,编译器可知的。
文章图片
image.png
1)Java Heap:分为(S0、S1、Eden)、Old区,不需要是连续的空间。
文章图片
image.png
4)JVM堆内存设置
-Xms初始堆、-Xmx最大堆、-Xmn年轻代大小、-XX:SurvivorRatio年轻代Eden和单个S区的比例。
推荐阅读
- jvm关于String
- jvm常见分析工具
- 08_JVM学习笔记_类命名空间解析
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- jvm常用命令
- Android免Root|Android免Root 修改程序运行时内存指令逻辑(Hook系统函数)
- iOS-OC运行时
- JVM监控工具教程
- jvm|jvm 谈谈引用(强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference))
- jvm|JVM调优(线上 JVM GC 频繁耗时长,出现 LongGC 告警,这次排查后想说:还有谁(...))