jvm模型深入理解

jdk是用于开发的,包括了jre和工具包以及java命令等,如果只是运行至安装JRE就行
JRE是java程序运行环境,包含了很多类库
JVM是java虚拟机,是JRE的一部分,负责解释执行字节码(class)文件,java跨平台是只JVM在补同平台不同

java中编写一个类,会编译成class文件,通过类装载系统将class文件装载到jvm中运行。
jvm内存模型分为共享区和私有区,其中共享区分别为java堆方法区(元空间),私有区分为java虚拟机栈本地方法栈、程序计数器

可以用javap -c Test.class > test.txt 命令 查看txt文件能看到指令代码,可以通过jvm指令手册查看指令具体的含义

程序计数器通过字节码执行引擎修改每次线程执行的指令行号,防止资源被其他线程抢走后重0开始执行。

虚拟机栈是一个线程对应的内存空间(先进后出),存放栈帧(相当于类中的方法),每个栈帧包含了局部变量表(其中0表示this)、操作数栈、动态链接、方法出口
操作数栈是临时存放需要进行计算的变量值,或则计算后的变量值
动态链接存放的是方法引用地址指向方法区的对应的代码信息

本地方法栈是存放Native方法的,Native方法底层调用的是C语言写的方法。

是存放java中new的对象,栈存放的是对象的指针地址,堆分为年轻代(1/3)和老年代(2/3),年轻代分为Dden(8/10)和survivor0(1/10)和survivor1(1/10)
字节码开启垃圾收集任务执行垃圾回收
minorGC是在年轻代发生,根据可达性算法如果没有被引用就发生GC,如果有引用将复制到S0区,此时年龄会+1,如果第二次回收时发现不能回收此时会将对象复制到S1并+1,每次都会在S0和S1之间交换复制年龄达到15会被放到老年代
FullGC是在老年代发生,相当于全局的垃圾回收,如果装满内存溢出OOM
可达性分析算法:根据GCROOT往下找,如果找到没有被引用的被当做垃圾回收

GC算法
标记清除算法:效率低,产生大量的内存碎片
标记整理(压缩)算法:比标记清除效率更低,没有内存碎片
复制算法:目前使用最多的算法,survivor区空间压缩一半,用于复制,对象存活率高的时候效率下降
分代收集算法

方法区(持久栈、jdk1.8后叫元空间)存放的是常量、静态变量(如果是对象存放的是内存地址)、类信息

JVM调优
工具:jvisualvm、arthas以及jdk自带的命令jps jstack jmap等等
arthas 是一个jar包
dashboard:查看实时数据面板
thread:查看当前线程信息,查看线程的堆栈
thread –all, 显示所有匹配的线程
thread id, 显示指定线程的运行堆栈
thread -b, 找出当前阻塞其他线程的线程(死锁),并找出代码行
thread -i 1000 : 统计最近1000ms内的线程CPU时间。
thread -n 3 -i 1000 : 列出1000ms内最忙的3个线程栈
thread –state ,查看指定状态的线程

一般都会调整以下几个参数:
-Xms10g :JVM启动时申请的初始堆内存值
-Xmx20G :JVM可申请的最大Heap值
-Xmn3g : 新生代大小,一般设置为堆空间的1/3 1/4左右,新生代大则老年代小
-XX:SurvivorRatio : 设置新生代eden空间和from/to空间的比例关系,关系(eden/from=eden/to)
-XX:NewRatio : 设置新生代和老年代的比例老年代/新生代

STW: Stop-The-World: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结丶应用程序停顿的⼀种状态
调优的目的就是减少STW(暂停)和降低GC垃圾回收的频率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值