(java笔记)JVM和gc

JDK、JRE、JVM

JVM(Java virtual Machine,java虚拟机):

JVM是用来运行java字节码文件(.class文件)的程序。JVM是跨平台的关键,它是运行在操作系统上程序,将JVM安装在不同的操作系统上运行,就屏蔽了不同系统之间的差异,让相同的java程序在不同的操作系统上运行出相同的结果。就是java语言跨平台的实现原理。

简单来说:jvm是一台纯软件的“机器”,可以安装在不同的操作系统上运行java字节码文件。用JVM来运行java字节码文件,使得java程序无需顾虑操作系统间的差异,在不同的操作系统上的JVM上运行出相同结果,只需安装对应操作系统的JVM即可。

JRE(Java Runtime Enviornment,java运行时环境):

jre是运行已编译程序所必须的软件环境,包含了JVM、java标准类库,jre提供给只想运行java程序的用户使用,不能用于创建新的程序,即不能将java源代码(.java文件)编译成字节码文件(.class文件)

JDK(Java Development Kit,java开发工具包):

jdk包含了jre,编译器,以及许多调试、分析等工具软件。它能创建和编译java程序

总的来说:jdk包含jre,jre包含jvm。

 JVM内部组成结构:

完整的jvm分成三部分:类装载子系统、运行时数据区(JVM内存区)、字节码执行引擎

当java命令执行时,JVM开始工作。流程如下:

1.类装载子系统将类装载到运行时数据区(JVM的内存区域)

2.字节码执行引擎运行运行时数据区的代码

Run-Time Data Areas(运行时数据区):

虚拟机的内存,里面划分了堆,栈,本地方法栈,方法区和程序计数器的内存空间

Java Virtual Machine Stacks(java虚拟机栈):

当一个线程运行时,虚拟机会将栈中分配出一个个小的、单独的线程栈专门给该线程运行,以放置线程运行的局部变量。

栈桢:在线程栈中划分出栈桢内存区,给线程中的方法放置它的局部变量,当方法结束销毁栈桢。

线程栈中栈桢的放置符合数据结构的栈FILO原则,因为栈桢跟方法嵌套顺序相吻合。

The PC Register(程序计数器):

程序计数器用来记录代码行号,也是一种内存空间,存放虚拟机马上要执行代码的行号(实际是指向方法区中存放那一行代码的内存地址)

线程在运行时除了在栈中分配线程栈,还会分配专属的程序计数器内存空间。

为什么需要设计程序计数器?

用于记录代码的执行位置,当某线程运行时时间片被优先级高的线程抢占后恢复运行时从程序计数器记录的位置开始运行。

Heap(堆):

用于存放实例化的对象,堆中又分为年轻代和老年代,内存配比一般为1:3。而年轻代中分为eden区(伊甸园区)、s0和s1区(统称survivor,存活区,分为s0和s1),内存配比一般为8:1:1。

ps: 这里的内存分配不是固定的,要视具体的项目而定。JVM调优主要就是对堆的调优,可以通过调整内存的分配比来优化性能,使JVM尽可能地减少full gc,因为STW会中断程序从而影响性能。

Method Area(方法区):

用于存放常量,静态变量,和类信息(包含方法代码)的内存空间

本地方法栈:

用于给本地方法分配需要的内存空间

gc的促发

程序在堆中不断实例对象,当堆中eden区存满就会STW(stop the world,程序会暂停运行),并促发minor gc(),minor gc对年轻代做垃圾回收:执行可达性分析算法区分垃圾对象,垃圾对象直接销毁,非垃圾对象移入s0区,分代年龄标记为1。

当第二次促发minor gc时,一样STW,并执行可达性分析算法区分垃圾对象,销毁整个年轻代的垃圾对象,然后将eden区非垃圾对象移入s0区,标记分代年龄为1,而原s0的非垃圾对象换位到s1,分代年龄加1。以此往复,当s0或s1中的非垃圾对象分代年龄达到15,而且仍为非垃圾对象,则被移入老年代。

可以理解为s0、s1就是分代年龄计数器,每次minor gc其中的非垃圾对象在s0区和s1区中换位并将分代年龄加1,当分代年龄超过15就被移入老年代。

当老年代存满就促发full gc,full gc会回收整个堆。若无垃圾对象可回收,继续实例对象则会发生OOM异常(Out Of Memory,内存溢出)。

整个JVM结构和gc流程:(红色指针表示引用关系)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值