Java的JVM简单学习

  • java跨平台:

java虚拟机,java能做到跨平台的关键所在,对于不同的操作系统,代码必须转换成各个操作系统对应的指令才能执行,而java通过jvm,在java代码编译后的字节码,字节码到操作系统指令集间抽象了一层,可以理解为转换器,即把字节码转化为对应操作系统的指令,通过这样的方式实现了java的跨平台功能。

java的代码执行属于边解释边执行,所以运行速度会比c语言的先编译再执行要慢上一些。对此,java使用了多种优化手段优化边解释边执行所带来的性能上的影响,主要是尽可能减少需要边解释边执行的代码量。

比如:对于热点代码,也就是执行多次的代码进行编译,以后执行该代码时直接运行编译后版本,这样就与c语音一样,不存在边解释边执行的性能损耗。(热点代码判断方式:方法执行次数判断,循环体循环次数判断)

  • JVM内存结构

堆:

存放对象,简单来说new出来的内存都放在这里。

栈:

存储局部变量表(各种基本数据类型,对象引用),操作数栈,动态链接,方法出口等信息,每一个方法从调用直到执行完成的过程,对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

程序计数器:

JVM执行的时候实际执行的就是一堆连续的指令,每个线程有一个独立程序计数器,程序计数器就是记录线程执行到哪一条命令, 这样才能在没有CPU时间片的时候记录执行的位置,下次获得时间片可以继续执行。

方法区:

运行时常量池是方法区的一部分。

类的元数据(例如类名,方法名,属性名,属性类型等等),

静态变量数据(被static修饰的数据,要求类加载成功才能访问),

静态常量数据(被static final修饰的数据,编译优化的时候一般优化到在类加载之前就初始化了),

运行时常量数据(类加载成功后, 会把静态常量池的数据拷贝到这里运行时产生的)。

 

  • 判断一个对象是否是垃圾对象 

简单来说,就是每次引用对象时,让计数器加1,每次释放对象时,让计数器减1,这样,当计数器为 0时,该对象便判定为垃圾对象。但是该方法对于循环引用无力,即A引用B,B引用A,这时候,就算他们没有被其他对象引用,我们也无法使用他们,但因为彼此相互引用,所以计数器永远不为0,便无法被判定为垃圾对象,也就不会被回收。   

简单来说,就是设置一个根节点(GC Root) ,若无法通过该节点的引用链到达目标对象,便判断该对象为垃圾对象,这样一来,哪怕出现循环引用,倘若他们没有被其他对象引用,即不再GC Root的引用树上,那么他们也会被判断为垃圾对象,从而被回收。 

 

  1. 引用计数法  
  2. 可达性分析法(JVM采用的方法)
  • 垃圾回收算法

 

 

做法:遍历整个内存,对垃圾对象占用的内存做标记,然后全部清除 。

特点:标记和清除都需要遍历对象,效率不是很高。
           清除之后会导致很多内存碎片问题,使得下一次内存分配管理成本很高。

 

 

做法:在分配内存时,预留一半的内存空间出来,在清除时,遍历整个内存使用的那部分,把存活对象使用的内存整个复制到另一半没用的内存空间上,然后清除整个原本使用的半边内存 。

特点:内存的利用效率变低,必须有额外内存作为备用。
           如果回收的对象比较少,每次拷贝的对象很消耗性能。
           适用垃圾比较少的情况。

 

  1. 标记清除算法(垃圾回收算法最基础的算法)
  2. 复制算法(解决了标记清除法内存碎片的问题)
  3. 标记整理算法(结合标记清除和复制算法优点的优化算法)

 

做法:一开始依旧是遍历整个内存,标记出垃圾对象的内存区,然后通过对存活对象内存整理,使其成为连续的物理存储,这样一来就解决了内存碎片的问题,同时也无需预留一半内存作为算法执行代价。

 

JVM根据对象存活时间不同采用分代回收,因为各种垃圾回收算法,分别适用于不同的场景,如存在大量垃圾对象的场景,存在大量长期存活对象的场景等,所以JVM根据场景的不同,使用不同的垃圾回收算法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值