浅谈JVM的内存结构

JVM之内存结构

1.JDK体系结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意点:
方法出口:当调用完一个方法后,保存继续往下面执行的代码的位置指针。

②Math math = new Math(),中的new Math()存放在堆中,而math存放在栈中,只是开辟了一个内存空间而已。

方法区:方法区中主要存放常量、静态变量、类信息等,比如private static final User user = new User(),静态变量user存放在方法区中,也是指向堆。

本地方法栈:比如new Thread().start()中的start方法内部就用了private native void start0();这个本地方法,其本质使用C语言编写的,它会去C语言的库里面找对应的实现(.dll文件相当于java中的xx.jar)。如果执行到了本地方法,本地方法栈就存放本地方法在运行时的内存空间。
⑤GCRoot:
在这里插入图片描述
堆内存:堆内存中有年轻代(1/3)和老年代(2/3),年轻代分成1个Eden Space(8/10)和2个Suvivor Space(2个1/10)。
假如部署了一个Web应用内,堆里面存储了大量的对象信息,当堆内存满了还要往Eden区加入时,这时会找出所有的GC Roots对象(即对象有不断的引用,最终成为一条链,这条链上的GC Roots就标记为非垃圾对象,将其复制到Survivor区中,而不在这条链上的对象就标记为垃圾对象,将会被销毁。比如程序结束时,堆里面的对象就没有引用了这时就不在这条链上,就被虚拟机回收了。)
在这里插入图片描述
垃圾回收机制详解:当S0内存也满了的时候,会再次对Eden+S0区域进行minor gc垃圾回收,还是之前的原则将在链上的GCC Roots复制到S1中,其余的将会清理,同理,S1内存满了会对Eden+S0+S1进行minnor gc垃圾回收,每次垃圾回收,其对象的分代年龄(在对象头中)会+1,当S1中对象的分代年龄>=15(比如静态常量、spring容器中的bean等等)复制在老年代中,当老年代的内存满了会进行full gc即对整个堆包括方法区进行垃圾回收,但是当full gc回收不了什么垃圾时,就会出现OOM(Out of Memory)。

STW:Stop the world,当虚拟机进行gc的时候会停止所有的用户进程。设计STW的目的是:如果在gc的时候,用户进程还在进行,就会去堆中找不断引用的对象链,一旦用户进程停止了,那些垃圾又得重新回收会导致很复杂、效率很低,因此是为了提高性能。
在这里插入图片描述

虚拟机调优:最重要的就是评估内存模型,然后在调优。
分析内存模型:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调优过程:在这里插入图片描述
⑨补充:进入老年代的另外一个条件
在这里插入图片描述
.class文件的字节码使用javap 命令进行反汇编的结果:
在这里插入图片描述


欢迎关注公众号Java技术大本营,会不定期分享BAT面试资料等福利。

在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值