java内存区域——《深入理解java虚拟机》读书笔记

  1. 对于java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题—— 2.1概述
    自动内存管理的优点:对应的开发人员不需要关注内存管理,通过自动的垃圾回收机制,在一定程度上可以防止内存泄漏,提高内存的使用率
  2. java虚拟机运行时数据区
    在这里插入图片描述
    由所有线程共享的数据区:随着虚拟机进程的启动而一直存在;
    线程隔离的数据区:依赖用户线程的启动和结束而建立和销毁。

java堆
所有的对象实例以及数组都应当在堆上分配——java虚拟机规范
从实现角度来看,java世界里“几乎”所有对象实例都在这里分配——2.2.4
“几乎”是因为作者认为随着java语言的发展,现在已经能看到些许迹象表明日后可能出现值类型的支持,而且目前即使遍历技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手段已经导致一些微妙的变化悄然发生,所以java对象实例都分配在堆上也渐渐变得不是那么绝对了。
java堆是垃圾收集器管理的内存区域——2.2.4
很多资料中经常出现的“新生代”“老年代”…只是一部分垃圾收集器(基于分代收集理论设计一些垃圾收集器)的设计风格,并不是java虚拟机具体实现的固有内存布局
方法区
存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存等数据——2.2.5
永久代:HotSpot虚拟机在jdk8之前使用永久代实现方法区(其它虚拟机没有永久代概念),后来废弃掉的主要原因是永久代有最大上限,即使不设置也有默认大小,导致java应用更容易遇到内存溢出问题。jdk8之后已经使用本地内存实现的元空间来代替。
方法区的内存回收目标主要是针对常量池的回收和对类型的卸载——2.2.5
运行时常量池是方法区的一部分——2.2.6
并非预置入Class文件中常量池的内容才能进入运行时常量池,运行期间也可以将新的常量放入池中(String类的intern()方法)
程序计数器
程序计数器可以看作是当前线程所执行的字节码的行号指示器——2.2.1
程序计数器是唯一一个在《java虚拟机规范》中没有规定任何OutOfMemmoryError情况的区域。
Java虚拟机栈
虚拟机栈描述的是java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程——2.2.2
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。这里说的“大小”是指变量槽的数量——2.2.2
本地方法栈
本地方法栈与虚拟机栈所发挥的作用类似,区别在于本地方法栈是为虚拟机使用到的本地(Native)方法服务——2.2.3
直接内存
直接内存并不是虚拟机运行时数据区的一部分,但是这部分也可能导致OutOfMemoryError异常出现。JDK1.4新加入的NIO类,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作——2.2.7

下一篇:HotSpot虚拟机对象——《深入理解java虚拟机》读书笔记

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值