JVM虚拟机运行时数据区

JVM虚拟机运行时数据区

在这里插入图片描述
class文件通过类加载子系统载入到方法区内部

为每一个线程申请一块独立运行的栈空间,可以用参数来指定栈的大小
-Xss,该大小是为每一个线程所分配的空间大小,而并非整个栈空间的大小。-Xss越大意味着同时开启的线程就会越少,因为栈的总空间的一定的。如栈空间全部用完,就会产生栈内存溢出。例如递归调用就可能产生栈内存溢出。java.lang.StackOverflowError。
栈帧
Java虚拟机为正在执行的线程中的每一个方法分配一个栈帧(一个方法对应于一个栈帧),栈帧内部还有局部变量表、操作数栈、动态链接、方法出口。
在这里插入图片描述
在这里插入图片描述
javap -c命令对class字节码文件进行反汇编生成jvm指令码
局部变量表:存放我们在方法中申请的局部变量,如果局部变量对对象的引用,例如有People这个类,那么就存在People people这个局部变量。

操作数栈:存放要给局部变量要赋的值,和存放临时运算结果,最终全部出栈,把值赋到了局部变量表内。

程序计数器:jvm马上要执行的线程的指令码的行号(每个线程都有自己的程序计数器,来标注现在执行到了第几行指令码)。

方法出口:在线程栈帧内存放着该方法执行完毕后,即该栈帧出栈以后继续执行代码的位置(即调用方法的位置)。

方法区(元空间metaspace):包含常量+静态变量+类元信息,例如静态变量 public static People people = new People(); 静态变量people是存放于方法区内部。而创建的对象则存在于堆内存中。不占用jvm内存,而是使用除jvm其余的物理内存。

动态链接:在线程的运行过程中,根据对象头中的klass word指针指向的类元信息的各个方法的入口地址加载到动态链接这部分内存空间中。

本地方法栈
native修饰的是本地方法,例如Java调用c++语言,通过本地方法做两种不同的语言进行的交互。当调用的c++时也会有局部变量,就存放在本地方法栈内。同样也是每个线程所独享的。

栈、堆、方法区之间的指向性问题
栈中的局部变量指向堆内存中的对象,堆内存中对象的对象头的klass word指向方法区中的类元信息,方法区中的静态变量指向堆内存中的对象。

堆中所创建的对象的内容

我们都知道,Java对象存储在堆(Heap)内存。那么一个Java对象到底包含什么呢?概括起来分为对象头、对象体和对齐字节。如下图所示:
在这里插入图片描述
对象的几个部分的作用:

1.对象头中的Mark Word(标记字)主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode;

2.Klass Word是一个指向方法区中Class信息的指针,意味着该对象可随时知道自己是哪个Class的实例;

3.数组长度也是占用64位(8字节)的空间,这是可选的,只有当本对象是一个数组对象时才会有这个部分;

4.对象体是用于保存对象属性和值的主体部分,占用内存空间取决于对象的属性数量和类型;

5.对齐字是为了减少堆内存的碎片空间(不一定准确)。

通过new关键字创建的对象一般都放入堆内,也有部分对象放入栈内
在这里插入图片描述
1)java堆是java虚拟机管理的内存最大的一块
2)java堆是被所有线程共享的
3)java堆的主要作用是存放对象实例
4)java堆是垃圾收集器管理的主要区域
5)收集器基本都采用分代收集算法
6)java堆可以分为新生代和老年代,再细致还可以分为Eden区,From Surivor区,To Surivor区
7)根据java虚拟机规范,java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续即可

新new出来的对象一般先放入Eden区,也有可能放入老年代。堆的大小可以通过参数进行调节-Xms默认大小 -Xmx最大内存。
minor gc回收年轻代(Eden区+Survivor区)

当Eden区放满就会触发minor gc,回收无引用的对象。依然存活着的对象就会移动到survivor from区,当Eden区再次放满时,再次触发minor gc 去收集Eden区+Survivor from区,依然存活的对象会放入survivor to区内,循环往复直到对象的分代年龄达到默认15,该对象会被移动到老年代(如spring中的bean),当老年代被放满时,会触发full gc(对所有区全部收集,此刻会Stop The World停止所有线程)
jvisualvm可以查看jvm运行状态
当堆内存被所有有引用的对象全部占满了的时候就会发生OOM(out of memory 堆内存溢出)JVM调优的目的是减少Full GC次数和减少STW的时间。估算一个对象的大小就是看看该对象的各字段的大小。对象尽量在minorGC中被回收掉,而不希望到老年代被FullGC回收掉。
什么样的对象可能被挪到老年代被fullgc回收掉?
针对上钟情况如何做jvm参数调优?

创作时间:2019年11月23日17:10:32于天目

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值