jvm 内存模型以及垃圾回收机制

  • java虚拟机内存主要分为堆内存栈(线程)内存本地方法栈内存元空间(静态方法区)以及程序计数器。

1、堆内存:

主要存放new出来的对象和全局变量。

2、栈内存(线程):

每个内存都有一个单独的线程。主要存放局部变量对象的引用动态链接以及方法出口

在栈内存中,每个线程都会重新分配一块内存,每一个内存就是一个栈帧。

在每个栈帧中,又会分为多个内存,这些个内存分别存放着局部变量、对象引用、动态链接和方法出口。如上图。

3、程序计数器:

通过javap命令反编译出来的class文件,可以通过jvm指令集查看具体的程序流程。而每一个指令都会有个计数器。程序计数器就是用来记录需要执行的下一行指令的位置。

4、元空间:

用来存储静态方法静态变量类元信息,元信息是类加载完成之后类的所包含的所有信息。

并且元空间中的数据在jvm启动的过程中只加载一次。

5、本地方法栈:

java自带的本地方法(native修饰的),在加载这类方法的时候,就会将方法加载入本地方法栈中。

  • java虚拟机垃圾回收主要发生在堆内存中,所以我们有必要详细了解一下堆内存中是什么样的结构。

话不多说先上图:

如上图, 堆内存主要分为年轻代年老代

1、年轻代:包括eden区和survivor区。而survivor区又分为两个大小相同的区,成为s0和s1。

当一个new的对象进入堆内存中的时候,首先进入eden区,当eden区大小超过一定界限时,发生minor gc(轻gc),

将还存活的对象放入到survivor区中。而这些对象如果有存活的,就在s0和s1两个区域当中循环,大概循环15次。如果还有存活的对象就放入老年区。

2、年老代:当年老代的的空间达到一个界限之后,就发生full gc(重gc)。如果此时的内存占用太多,就会发生内存溢出。

  • jvm调优工具https://gceasy.io
  • 常用的jvm内存检测工具是安装jdk之后在cmd中输入jvisualvm,如果需要查看堆内存的具体数据,需要安装一个gc插件。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值