2020-11-03

栈:

存放线程内部的局部变量;每个线程都会分配一个栈(线程),栈内存放着线程相关的局部变量。
栈内包含:局部变量表、操作数栈、动态链接、方法出口。

局部变量表:

存放变量名
操作数栈:

操作数的临时存放,对数据进行入栈出栈操作。

程序计数器:

每个线程都有自己的程序计数器,指向执行的代码的内存地址。为什么要设计一个程序计数器:java多线程中,当前线程执行到某行代码时被高优先级的线程打断,当前线程挂起,高优先级线程执行完后,唤醒当前线程,需要依靠程序计数器定位到上次程序执行的位置。

动态链接:

与静态链接对应,代码在执行过程中,符号引用转换为直接引用

方法出口:

A函数执行时,调用b函数,b函数执行完成后返回到a方法继续执行,方法出口记录了返回a方法后的代码执行位置。

局部变量表中变量值为对象时,变量中存放的是指向对象的引用,对象实际存放在堆中。

方法区中存放:

常量、静态变量、类信息。静态变量值为对象时变量存放的也是执行堆中的一个引用。


本地方法栈:目前基本不用,早期java调用c++方法时使用 private native 定义的方法会分配本地方法栈;


堆内存分配:
堆分为老年代与新生代,老年代占三分之二,新生代占三分之一。新生代分为伊甸区、s1、s2三部分。s1 s2分别占十分之一空间,伊甸区占十分之八。对象首先在伊甸区存放,存满后执行一次minion gc,minion gc时会查找栈中及方法去中的变量作为gc root到堆中查找需要回收的对象,对gc root有引用的对象标记为不可回收。标记完成执行minion gc将不可回收对象放入s1中,伊甸区垃圾对象执行删除。
伊甸区对象再次放满后再次执行minion gc,他会在伊甸区以及s1区标记需要回收的对象,minion gc后会把存活对象放大s2中。后面的minion gc 会把存活对象在s1 s2中交替存放,当对象交替次数达到指定值时(一般默认15次)将对象放入老年代。老年代存放满了会执行full gc ,full gc会对整个堆内存执行垃圾回收。

gc期间用户线程会暂停掉,造成用户体验上系统卡顿。暂停的原因是如果用户线程不暂停,栈中数据数据会一直变化,局部变量有可能在操作完成后全部释放,gc的数据会以这些变量作为gc root,造成标记垃圾对象无法准确标记。

方法区内存空间的设置:
-XX:MetaspaceSize=N  元空间触发full gc的初始阈值,默认21m. 不设置时,这个数值会自动伸缩。当第一次触发full gc后剩余的空间小时,下次gc会增加full gc的空间值。剩余空间多时会适当降低下次full gc的空间大小。
-XX:MaxMetaspaceSize=N 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小
由于调整元空间大小发生full gc是非常昂贵的操作,一般8g内存会设备元空间大小为256m,初始值与最大值相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值