Java资料整理Java学习笔记Java知识

《深入理解Java虚拟机》读书笔记1:Java技术体系、Java

2017-03-19  本文已影响536人  ginobefun

国内JVM相关书籍NO.1,Java程序员必读。读书笔记第一部分对应原书的前两章,主要介绍了Java的技术体系、Java虚拟机的发展历史、Java运行时区域的划分、对象的创建和访问以及内存溢出的实战。

Part 1: 走进Java

第一章 走进Java

概述

Java的优点

Java技术体系

Sun官方所定义的Java技术体系包括:

JDK是用于支持Java开发的最小环境,JRE是支持Java程序运行的标准环境,整个Java体系如下所示:

Java技术体系

Java发展史

Java技术发展

Java虚拟机发展史

展望Java技术的未来

实战:自己编译JDK

sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant

在IDE工具中进行源码调试

NetBeans(支持C/C++开发的版本)

本章小结

本章介绍了Java技术体系的过去、现在以及未来的一些发展趋势,并独立编译一个OpenJDK 7的版本。

Part 2 自动内存管理机制

第二章 Java内存区域与内存溢出异常

概述

对于Java程序员来说,在虚拟机自动内存管理机制下,不需要为new操作去写配对的delete/free代码,不容易出现内存泄漏。但是如果出现内存泄漏问题,如果不了解虚拟机的机制,便难以定位。

运行时数据区域

运行时数据区域

程序计数器

Java虚拟机栈

本地方法栈

Java堆

方法区

运行时常量池

直接内存

HotSpot虚拟机对象探秘

进一步了解虚拟机内存中数据的其他细节,比如它们是如何创建、如何布局以及如何访问的。下面以虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。

对象的创建

对象的内存布局

对象的访问定位

通过句柄访问对象 通过直接指针访问对象

实战:OutOfMemoryError异常

Java堆溢出

Java堆溢出

解决思路:先通过内存映像分析工具对dump出来的堆转储快照进行分析,先分清楚是内存泄漏还是内存溢出;如果是内存泄漏,进一步查看泄漏对象到GC Roots的引用链,从而确认为什么无法回收;如果是内存溢出,则应当检查虚拟机堆参数(-Xmx与-Xmx)或检查是否存在对象生命周期过长、持有状态时间过长的情况;

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

虚拟机栈溢出

虚拟机的默认参数对于通常的方法调用(1000~2000层)完全够用,通常根据异常的堆栈日志就可以很容易定位问题。

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

对于这个区域的测试,基本思路是运行时产生大量的类去填满方法区(比如使用反射和动态代理),这里我们借助CGLib直接操作字节码运行时产生大量的动态类(很对主流框架如Spring、Hibernate都会采用类似的字节码技术)。在这里需要特别注意垃圾回收的状况。

借助CGLib使方法区出现内存溢出异常1
借助CGLib使方法区出现内存溢出异常2

本机直接内存溢出

本机直接内存溢出1
本机直接内存溢出2

DirectMemory导致的内存溢出,在Heap Dump里不会看见明显的异常。如果发现OouOfMemory之后Dump文件很小,程序又使用了NIO,那就可以检查下是否这方面的原因。

本章小结

学习了虚拟机的内存是如何划分的,对象是如何创建、布局和访问的,哪部分区域、什么样的代码和操作可能导致内存的溢出异常。

系列读书笔记

扫一扫 关注我的微信公众号
上一篇 下一篇

猜你喜欢

热点阅读