深入理解Java虚拟机----内存区域与溢出

为什么要学虚拟机的内存模型

最近学习了jvm虚拟机的内存模型,开始学习时,我就像一只填鸭,书上写什么就接受什么,学完了也只是理解了一到两成的知识。所以我现在想带着我的疑问去学习,首先为什么我们需要学习jvm虚拟机的内存模型?
内存顾名思义就是存放东西的,存放的是程序运行时的数据。那既然内存是存放东西的话,那我们就要清楚把数据怎么去放到内存,用的时候怎么从内存中拿回来。所以学习jvm虚拟机的内存模型就是学习jvm怎么去管理内存。

jvm的内存模型划分

根据数据的特性,jvm把一大块的内存划分成几个区域。


这里我们需要解决几个问题。
第一、这几个区各自的存放哪些数据,
第二、怎么放
第三、用的时候怎么拿回
第四、数据长什么样
第五、为什么要这样划分。
第六、实际中怎么配置这几个区域

一、 各个区域存放的数据

程序计数器:每个线程都需要一个程序计数器,是指示当前线程工作到了哪一条指令。
本地方法栈:存放的函数传递的参数,局部变量,函数返回地址,指令操作的临时数据。
虚拟机方法栈:
堆:对象的实例实际存放的地方
方法区:类的元数据,class对象,静态变量
常量池:定义在类中的常量,字符串常量

二、怎么放

程序计数器

	不知道

本地方法栈

    一个线程创建的时候,就会去申请一个连续区域。方法调用时,会不断的往栈顶去延伸。

	创建一个对象时,就会向jvm申请一块内存,内存大小要足以放入数据。
	指针碰撞算法,指针向空闲的区域移动。
	标记算法,有个表记录哪些内存没被用,哪些没被用。

五、配置jvm各内存区域的大小

-Xms:初始堆大小
-Xmn:堆年轻代的大小
-Xmx:堆的最大限制

虚拟机栈

-Xss:每个线程的栈大小

方法区(持久代)

-XX:PermSize  持久代大小
-XX:MaxPermSize 持久代最大大小

六、为什么要这样划分

未解决

内存溢出

##虚拟机方法栈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值