java内存区域

java内存区域

栈:每个线程都有它的栈
一般理解: 我们生命的变量句柄存储在栈上以及基本类型都存储在栈上
比如 int a; User user;
本地方法栈除了存储这些以外 还未虚拟机使用的native服务

堆:此内存区域唯一的目的就是存放对象实例,各个线程的共享区域,在划分内存的时候可能有线程安全问题,这个问题在 new 一个类中有说到

方法区:
存储已经被虚拟机加载的类信息,常量,静态变量,ps:它还包含了静态常量池

直接内存:
在JDK1.4中引入了NIO,引入了一种基于通channel与缓冲区Buffer的I/O方式,它可以使用Native函数库直接分配对外内存,然后通过一个存储在java对中的DirectByteBuyffer作为这块内存的引用进行操作
这样能显著提高性能,因此避免了在java堆对和Native堆中来回赋值数组
虽然redis不是java写的 但是呢 这个地方有异曲同工之妙

问题来了:User user = new User();到底发生了什么,又是如何分配的

方法区放入了user的对象信息
栈存放了user定义的句柄
堆存放了对象定义实例化的数据

精准指向一个变量就需要
栈的句柄指向堆的实例数据以及方法区的类定义

 

posted @ 2021-01-07 23:19  发条良子  阅读(50)  评论(0)    收藏  举报