今天看JVM的过程中收获颇丰,但一想到这些学习心得将来可能被遗忘,便一阵恐慌,自觉得以后要开始坚持做读书笔记了。

操作系统层面的内存管理

物理内存是一切内存管理的基础,Java中使用的内存和应用程序的内存一样是从物理内存申请下来的内存。物理内存也就是寄存器,通过地址总线与CPU相连,通常情况下地址总线与寄存器有着相同的位数,同时也决定了处理器最大可寻址的地址空间。

为了提高物理内存的利用率而产生了虚拟内存,也就是逻辑上的内存。为了保证操作系统和应用程序的稳定性,运行在操作系统中的用户程序不能访问操作系统所使用的内存空间,内存空间因而被划分为了内核空间和用户空间。

内存的交互中总结为下图

Java中需要使用内存的组件

  • Java堆
    一旦分配完成,堆的大小就将固定,不能在内存不够时再向操作系统中重新申请,同事当内存空闲时也不能将多余的空间交还给操作系统。

  • 线程
    通常JVM为线程创建的堆栈在256KB~756KB之间。

  • 类和类加载器
    任何系统类或通过应用程序加载器加载的任何应用程序类都不能在运行时释放(存储在堆中,永久代)。换句话说,加载其实是一种I/O操作,生成的类字节码对象在堆中的方法区中,提供执行指令,提供运行时常量池,并且可以作为对象被操作。

  • NIO
    分配的是内核空间而不是用户空间上Java堆中的内存,可以避免从内核空间到Java堆上的切换操作,但是通常需要显示的调用System.gc()来释放NIO持有的内存。

  • JNI
    本机代码如C语言程序可以调用Java方法,也会增加Java运行时内核空间中的本机内存内存占用。

JVM内存结构

在Java虚拟机规范中将Java运行时数据划分为6种

  • PC寄存器数据

  • Java栈

  • 方法区
    方法区这个存储区域也属于Java堆中的一部分(永久区)

  • 本地方法区
    本地方法栈是为了JVM运行Native方法准备的空间,由于很多Native方法都是用C语言实现的,所以它通常又叫C栈。

  • 运行时常量池
    在用户空间Java堆上的方法区中。

操作系统的内存分配策略

  • 静态内存分配策略
    编译时计算存储空间需求,加载时一次性分配内存空间
    如:堆的创建

  • 栈式内存分配策略
    运行中进入一个模块时,在知道该模块所需的数据区大小时才能为其分配内存
    如:数组、malloc

  • 堆式内存分配策略
    当程序真正运行到相应代码时才会知道空间大小,并为其分配内存
    如:集合、创建对象

Java中的内存分配详解

  • Java内存分配给栈
    创建线程:堆式内存分配策略,创建线程栈
    激活方法:栈式内存分配策略,JVM根据操作栈大小创建栈帧,并在线程栈中压入该栈帧

  • Java堆中分配内存
    创建对象:堆式内存分配策略,JVM在堆上为该对象分配内存空间
    所有对象的存储空间都是在堆中分配的,但该对象的引用却是在栈帧中压入的

JVM内存回收策略

  • 静态内存分配和回收
    栈上的内存分配和回收(弹出栈帧)

  • 动态内存分配和回收
    堆中的内存分配和回收(垃圾回收)

这里分了动态和静态,其实我更喜欢用操作系统的栈式内存分配策略和堆式内存分配策略来解释

  • 垃圾回收
    JVM的垃圾回收关键在于整体的效率优化上,这里讲解了垃圾回收算法的发展和常见的内存问题,现在还看不懂

《深入分析Java Web技术内幕》读书笔记之JVM内存管理的更多相关文章

  1. JAVA Coder 的《深入分析Java Web 技术内幕》读书笔记

    本文基于<深入分析Java Web 技术内幕> <深入分析Java Web 技术内幕>,作者是 许令波,电子工业出版社.本文只是记录书本当中的精彩部分,作个人回顾和技术分享,请 ...

  2. 深入分析Java Web技术内幕(修订版)

    阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著   ISBN 978-7-121- ...

  3. Servlet工作原理解析 《深入分析java web 技术内幕》第九章

    参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...

  4. developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章

    developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章 深入理解 Session 与 Cookie Session 与 Cookie 不管是对 Java Web ...

  5. 《深入分析Java Web技术内幕》读书笔记 - 第1章 深入Web请求过程

    第1章 深入Web请求过程 1 1.1 B/S网络架构概述 2 基于统一的应用层协议HTTP来交互数据. 1.2 如何发起一个请求 4 HTTP连接本质是建立Socket连接.请求实现方式:工具包如H ...

  6. 深入分析Java Web技术内幕

    深入web请求过程 发起一个http请求的过程就是建立一个socket通信的过程 HTTPClient是一个开源的实现了http请求的工具包 深入分析java I/O的工作机制 深入分析java We ...

  7. 深入分析java web技术内幕目录一览

    Web请求过程 如何发起请求:browser,httpclient http解析:chrome ,cache Dns域名解析:域名缓存 cdn:负载,动态加速,回源 Java I/O I/0类库的基本 ...

  8. JVM内存管理 《深入分析java web 技术内幕》第八章

    8.1 物理内存与虚拟内存 物理内存RAM(随机存储器),寄存单元为寄存器,用于存储计算单元执行指令的中间结果. 连接处理器和RAM或者处理器和寄存器的是地址总线,这个地址的宽度影响了物理地址的索引范 ...

  9. java体系结构与工作方式 《深入分析java web 技术内幕》第七章

    java体系结构与工作方式 7.1 JVM体系结构 何谓JVM JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能 指令集:计算机所能识别的机器语言 ...

随机推荐

  1. HDU 1059(多重背包加二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. iOS:Masonry约束经验(19-03-21更)

    1.label约束: 1).只需约束x.y 点相关就行.宽高 长度相关不用约束,就算用boundingRectWithSize计算出来的,也可能不准. 如:top.bottom二选一,trailing ...

  3. JQuery 同时获取多个标签的指定内容并储存为数组

    在网页开发中经常会碰到获取同种类型的 标签 的值得问题,比如下面的两种情况. 当需要批量获取同种标签的指定值时,新人就会碰上一点小麻烦. 比如 id=problem1的demo var list1=$ ...

  4. 用file标签实现多图文件上传预览

    效果图: js 代码: <script> //下面用于多图片上传预览功能 function setImagePreviews(avalue) { var docObj = document ...

  5. 记一次MacBook Pro无法连接wifi网络修复

    解决方案: https://blog.csdn.net/kimbing/article/details/79321001 真的哭了 原因是插入了我的USB3.0拓展坞影响了wifi信号 不知道原理是啥 ...

  6. 高性能MySQL--创建高性能的索引

    关于MySQL的优化,相信很多人都听过这一条:避免使用select *来查找字段,而是要在select后面写上具体的字段. 那么这么做的原因相信大家都应该知道:减少数据量的传输. 但我要讲的是另外一个 ...

  7. PhpStorm 全局查找的快捷键

    本页面查找 :   ctrl  + f 全局查找 : ctrl + shift + f 自己定义 :文件 -> 设置  -> 快捷键  ->  修改

  8. 【原创】frozenset集合函数入门及实例

    函数作用 frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素.与之对应的是set函数,set无序排序且不重复,是可变的,有add(),remove()等方法. 函数原型 f ...

  9. 监控生产线上服务器的docker容器及主机

    1. 部署cadvisor容器,用来收集host上的容器信息,该容器部署在需要收集容器信息的每一个主机上部署: docker run -v  /:/rootfs:ro -v /var/run:/var ...

  10. dtree的自定义select动作

    项目中用到了dtree,别问我为什么用这么古老的插件,因为简单啊orz,文件树的条目不多,detree加载卡顿的问题也不用解决,开森. 在使用过程中在选择节点后需要自定义一些onclick的动作,本来 ...