JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统JavaEE 学习专题

《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存

2019-12-25  本文已影响0人  Java旺

前言

image

最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的——内景。家里 - 下午

我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本翻翻呢?但是在家里好像有点看不下去啊,是太安逸了吗?最近那本《图解 HTTP》也还没看完,感觉暂时有点不想看了。(走到书架前)还是挑几本优先级比较高的带到███下班的时候看吧。(沉思)嗯,这本带过去~

当我拿起《深入理解 Java 虚拟机》这本书的那一刻,心里咯噔一下——唉,PM10 浓度又上升了,地球环境越来越差了啊,万恶的地球人!

正文

一、运行时数据区域

Java 虚拟机在执行 Java 程序时,会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁时间。

1、程序计数器

2、Java 虚拟机栈

3、本地方法栈

4、Java 堆

5、方法区

6、运行时常量池

7、直接内存

二、HotSpot 虚拟机对象探秘

1、对象的创建

类加载检查 -> 分配内存 -> 初始化零值 -> 设置对象头 -> 执行 init 方法

(1)类加载检查

虚拟机遇到 new 指令时,会先检查这个指令的参数能否在常量池中定位到一个类的符号引用,以及这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就必须先执行相应的类加载过程。

(2)分配内存

对象所需内存的大小在类加载完成后便可确定,为对象分配内存空间等同于把一块确定大小的内存从 Java 堆中划分出来。

分配内存的两种方式:

Java 堆是否规整(是否有内存碎片),由所采用垃圾收集器的算法所决定。“标记-清除”算法会产生内存碎片,而“标记-整理”和复制算法则不会。

如何保证分配内存的线程安全:

(3)初始化零值

将分配到的内存空间初始化为零值(不包括对象头),保证对象的实例字段在 Java 代码中可以不赋初始值就直接使用。

(4)设置对象头

虚拟机需要对对象进行必要的设置,例如这个对象是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等。这些信息存放在对象的对象头中。

(5)执行 init 方法

把对象按照程序员的意愿进行初始化。

2、对象的内存布局

HotSpot 虚拟机中,对象在内存中存储的布局可分为 3 块区域:对象头、实例数据和对齐填充。

(1)对象头

对象头包含两部分信息:

(2)实例数据

对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。

(3)对齐填充

仅仅起着占位符的作用,不是必然存在的,也没有特别的含义。

由于 HotSpot 虚拟机的自动内存管理系统,要求对象起始地址必须是 8 字节的整倍数,换句话说,对象的大小必须是 8 字节的整倍数。而对象头部分正好是 8 字节的整倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

3、对象的访问定位

Java 程序需要通过栈上的 reference 数据来访问堆上的具体对象。目前主流的访问方式有句柄和直接指针两种。

(1)句柄

(2)直接指针

三、OutOfMemoryError 异常

Java 虚拟机中,除了程序计数器外,其他几个运行时区域都有发生 OutOfMemoryError(OOM)异常的可能。

1、Java 堆溢出

异常堆栈信息:java.lang.OutOfMemoryError: Java heap space。

异常原因:内存泄露、内存溢出。

异常处理:

-Xmx256m -Xms128m

2、虚拟机栈和本地方法栈溢出

异常堆栈信息:java.lang.OutOfMemoryError: unable to create new native thread。

异常原因:创建线程过多。

异常处理:

-Xss128k

3、方法区和运行时常量池溢出

异常堆栈信息:java.lang.OutOfMemoryError: PermGen space。

异常原因:载入内存的类、常量过多。

异常处理:调大方法区容量(-XX:PermSize、-XX:MaxPermSize),例: -XX:PermSize=64m -XX:MaxPermSize=128m

4、本机直接内存溢出

异常堆栈信息:java.lang.OutOfMemoryError: Direct buffer memory。

异常原因:使用了 NIO 等用到直接内存的技术时就有可能出现。

异常处理:调大直接内存容量(-XX:MaxDirectMemorySize),例: -XX:MaxDirectMemorySize=512m

原文链接: http://www.cnblogs.com/jingqueyimu/p/12081459.html

上一篇 下一篇

猜你喜欢

热点阅读