jvm实战性能调优课笔记

昨天上课学习到

java 的跨服务特性是通过jvm里 屏蔽不同不同操作系统的机器码 而实现的。

jvm的的构成 如下图3部分  1 类装载子系统  2 运行时数据区(内存模型)3字节码执行引擎 其中2部分就是调优部分。所谓jvm调优到底调的目的是什么呢?调的是什么呢?调优的目的-》减少fullGC -》减少STW ->减少高并发时 用户卡顿现象出现-》提高效率。调的是内存。

jvm的内存模型  的构成  a堆  b方法区(jdk 1.8 之后改叫元空间) c栈  d程序计数器  e本地方法栈

c栈  一个主方法就是一个线程栈  (这个线程栈占用了jvm中栈的一块空间)。主方法的线程栈中先有了主方法的一个线程栈帧,当主方法调用了类中其他方法compute时(其他方法也是一个线程栈帧,一个线程栈帧是线程栈中的更小的一个区块,所以 一个方法 可以= 线程栈帧  = 线程栈  粗略的讲),在主方法的线程栈中又加入compute的一个线程栈帧 ,直到compute执行完成 ,compute的线程栈帧退出线程栈,此时继续执行主方法的线程栈帧。

--值得一提 每个栈帧中又分为 局部变量表(放置方法中的所有变量名  从1开始排序)  操作数表(放置所有操作室数  如 下图createOrder 1 2 10 )  动态链接(局部变量math 对应的不是操作数  而是对象 所以在main栈帧中局部变量表math 有个地址指向堆中Math对象  这个指向堆的地址【一条指针】就是动态链接)  方法出口 (当执行完其他方法compute 时  compute栈帧中有条指向main栈帧中接着该执行的位置的地址  如compute栈帧 指向main栈帧 system.out.println("test")的位置)  4 个部分

d程序计数器 每个方法当前执行或接下来要执行的位置 (从0开始) 。每个栈帧都会有自己的一个。执行完修改还是先修改执行(我觉得应该是执行完修改,有待验证,不算非常重要吧)由字节码执行引擎修改d

b方法区 存放常量,静态变量,类信息  (user 静态变量的值是对象  所以指向堆)

e本地方法栈  native修饰的底层是c++或 c的方法

a堆  放置对象的位置  由 老年代   伊甸园  survivir(s0  s1 构成)  3大部分构成  其中老年代 默认展内存2/3  剩余1/3内存  伊甸园 和 s0  s1 的比例为  8 :1:1  。

在老年代发生的是fullGC

在伊甸园和survivor 发生 minorGC(young GC)

当产生一个新对象时 放在伊甸园区   ,当伊甸园满了时 执行minorGC  此时STW(minorGC 引发的STW 较短暂)

--执行GC时 如何判断是否是垃圾对象呢?jvm使用 可达性分析算法(单前一个对象Math引用另一个对象User【对象Math的类Math中的成员变量user引用了对象User】,User又引用了别的对象,,,直到找到一个没有引用别的对象的对象K【对象K 就是gcroot】)   GC时 在方法区和线程栈中找到所有的gcroot及gcroot引发的一串对象  这所有的对象就是  非垃圾对象  ,字节码执行引擎中有一个专门做垃圾手机的线程 此时收集所有 伊甸园 和 s1的垃圾对象。

在minorGC 时  非垃圾对象会被放到S0 且年龄加1 当下一次minorGC时(因为伊甸园又满了触发   清理 伊甸园和sruivivor其阿红之一)  年龄为1的对象依旧是非垃圾对象  会被移s1 并且年龄加1,当有年龄达到15的 老不死对象 会被移入到老年代(被移入老年代的对象有2种   1 年龄达到15的  2 一批对象同时要被放入  Survivor 中  但这批对象的大小总和 》 s0内存大小的50% 的 如  60M 的对象要放入 100M 的s0 中放不下  这批对象将直接被放入老年代)。所以垃圾对象每次被minor收集  非垃圾对象又不到15岁的就一直在s0  s1之间跑来跑去 直至  到了15岁还是不是垃圾就被 放到 老年代中  ,当老年代满了 触发  fullGC -》触发STW(fullGC引发的STW 较长)-》jvm调优  在于对老年代 伊甸园 survivor的分配

 

课程录屏 (实例在1.20.00 左右开始哦)性能调优专题-Java虚拟机性能调优与底层原理分析-0311  --
链接:https://pan.baidu.com/s/1uQzgIS_6IjIFvcaAuVV5zw 
提取码:jtfd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是JVM  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值