JVM性能优化

在这里插入图片描述

什么是JVM

Java虚拟机从软件层面屏蔽了底层硬件指令层面的细节
C C++跨平台 比如Redis

  • JDK JRE JVM 区别

      JDK包含JRE,JRE包含了JVM
    

JVM底层原理

在这里插入图片描述

	类加载子系统、执行引擎、JVM运行时数据区
	1、类加载子系统加载硬盘上的内容,加载到内存中;
	2、执行引擎,加载内存中的内容,CPU去调度JVM;
	
	栈-->数据结构-->存储内容-->先进后出FILO
	
	一个线程包含了,栈,本地方法栈,程序计数器
	
	栈里面包含了栈帧,栈帧包含局部变量表、操作数栈、方法出口...
	操作数栈里面包含了JVM指令
	局部变量是定义的一些局部变量
	
	程序计数器:指向当前线程所知晓的字节码指令的(地址)行号;
	本地方法栈:native修饰
	方法区:存储类的属性、常量,变量,成员属性

性能调优

在这里插入图片描述

堆
阿里面试题:
	为什么java需要性能调优:
	在有限的空间做无限的事情
	minor jc root可达,对root不可达的对象将状态置为游离状态
	对于root可达的对象,将Eden园区的对象移动到from区域,age+1
	在新生代的对象达到15次的时候,进入老年代
	当老年代达到饱和的时候,会触发full gc
	STW 停顿  
	晋升:age = 15 老年代
	      创建对象内存占比50%
	为什么java需要使用分代的思想?
	更少对象进入老年代,减少STW,提高效率
  • 什么是STW?

      STW是 **Stop The World**的缩写,短暂的对程序进行停止
    
  • 为什么java需要性能调优

      JVM是运行在物理内存之上的,为了防止内存溢出,给JVM划分了一部分空间,比如说机器物理内存有8G,
      有一部分划分给JVM,其他的内存需要让其他的程序去运行,那么JVM就只占了一部分空间,当在堆里面
      存储的对象大小小于或等于被划分空间的时候,对象执行回收处理。
    
  • 新生代和老年代的占比情况

      新生代占用总空间的1/3,老年代占用总空间的2/3;
      新生代eden区、from区、to区的占比情况是8:1:1
    
  • 什么时候执行回收?

      1、对象在eden区域创建后,默认对象age=0,当eden区域装载满了的时候,触发minor gc,
      2、会检测对象是否为root可达对象,如果是,那么就进行对象转移到from区,age=age+1,
      如果不是根可达对象,将对象的状态置为游离状态,告知JVM,该对象可以被回收,
      3、回收掉之后,eden区域继续创建对象,重复第一步的操作;
      4、当对象检测是可达对象的时候,会将eden区域的age=age+1,from区域的对象age=age+1,并且将现有的eden区域的对象和from区域的对象移动到to区域,from区域置为to区域,to区域置为from区域;
      5、重复执行,当age=15或者当from区域或者to区域对象占比达到50%的时候,会将对象移动到老年代,并释放新生代的内存空间;
      6、当老年代对象装满的时候,出发full gc,程序进入STW状态。
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值