JVM白小白——内存结构(二)

目录

 

一、JVM是啥?我为什么要学JVM。

二、宏观导图:

三、JVM 运行时内存的基本结构:

四、运行时数据区:

1、堆

2、方法区

3、虚拟机栈

4、本地方法栈


一、JVM是啥?我为什么要学JVM。

在写代码中,写着写着就会有一种错误,叫做堆栈溢出。这是个啥? 

C++编程语言,程序员在需要对创建的每一个对象负责到底,从它的创建new,引用,到最后的销毁delete都需要负责到底。在java中,把这些对对象的处理交给了JVM。只要有JVM就不需要担心怎么给对象分配合适的地方存储,对象什么时候被释放,占用的内存空间什么时候回收。JVM会有内存分配策略,垃圾回收策略,来针对性解决问题。 

面对内存溢出这样的问题,也会有对应的内存调优方案,通过图形化或命令行工具可以对内存分配使用进行监控查看。如下图JVM基础部分的三大内容。

通过JVM可以更好地理解代码的运行逻辑内存分配,写出更优秀的代码。

二、宏观导图:

三、JVM 运行时内存的基本结构:

对每一部分的简单认识:

四、运行时数据区:

1、堆

new出来的对象会放入堆中,堆存放这些对象也有它的规则。就像我们大批量的插入数据,为了保证数据的完整性,安全性啥的,都有个缓冲区,它可以很大一次性存放很多,之后再根据存入数据的特殊属性,把他它们分散到不同的地方。你看多了就会发现,计算机存取数据好像都是这一个套路。

其实这也就是内存的分配策略,分带策略

  • 优先分配到eden区
  • 大对象,直接进入到老年代
  • 长期存活的对象分配到老年代

栗子: 

public class TestJVM {	
    public static void main(String[] args) {
		byte[] b1 = new byte[4*1024*1024];
	}
}

2、方法区

不同的JDK版本发现,对方法区和堆这两个地方存放数据有些许不同。这里这个方法区既然是线程共享区,就一定是存公共的经常使用的资源,比如静态变量,常量,编译后的代码等数据。它和堆都是共享区,都可以被垃圾回收。

3、虚拟机栈

 

是线程私有区,每一个线程会有一个单独的栈,每一个栈的基本单位是栈帧,每一个栈帧中有关于这个线程成当前方法的信息:比如该方法在运行时需要的常量池指针,这个方法的局部变量,方法返回的地址。

可以通过栈找到堆中对应对象,有如图中的两种方式:一种是句柄访问对象,一种是直接指针的方式。

4、本地方法栈

本地方法栈和虚拟机栈功能类似。不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。

 暂时理解到这里,还会不断更新,欢迎交流学习~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢美玲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值