[java基础] java 虚拟机内存机制

了解java虚拟器内存机制的好处

当我们需要解决一些棘手的问题,比如性能优化,解决OOM异常时,如果我们了解java虚拟机的内存机制,就知道从哪里下手处理这些问题了


如何了解

我从三方面去说明他

进程级别

我们在pc上做一个应用,在手机上做一个app,都是以进程的级别存在的。在进程这个级别中,内存被分配给/分配为 java堆、方法区(含有常量存储区)、各个线程

  • java堆:java堆是GC线程回收内存的区域,他主要是用来存储各种对象
  • 方法区:方法区存储了class在加载之后的信息,如全局变量,方法等
  • 常量存储区:静态变量存储区是包含在方法区之中的,他用来存放各种static final常量,这个内存区是可变的

除了java堆和方法区,其他的内存空间就分配给各个线程了

在这些内存区内都会有可能出现OOM异常的

线程级别

  • 程序计数器:每一个线程都会有一个程序计数器,这个在debug的时候跟踪走到哪一步。程序计数器使用的内存很少,而且这部分是不会产生OOM异常的!
  • java虚拟机栈:顾名思义,java虚拟机栈是以栈的方式存在的,所以他的访问速度要比堆快的多。java虚拟机栈存储的是本地变量,java的基本数据类型,对象类型/array类型存储的是指向java堆的地址
  • native方法栈:native方法栈对应java虚拟机栈存储的是native方法的内容
栈和堆不同之处,栈是会抛出stackOverflowException的,不过也有可能会抛出OOM,但是在实战中,stack的内存超出了内存限制,一般抛出的都是stackOverflowException

其他

  • 直接内存:直接内存是在NIO时会用到,他是为了避免native堆和本地堆来回copy数据,而实现的技术

以上内容,如有错误,请大神们指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值