今天看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. Gradle Goodness: Run a Build Script With a Different Name

    Normally Gradle looks for a build script file with the name build.gradle in the current directory to ...

  2. ext4文件系统特性浅析

    ext4作为Linux下的文件系统因其简单性.易管理性.兼容性强等特定,深受大多数用户喜欢,并且作为大多数Linux发行版中的默认文件系统.但是随着现在文件数目的增多以及文件数据的增大,ext4文件系 ...

  3. docker 导出导入

    容器导出 docker export -o myname.tar 容器id 容器导人 docker import myname.tar httpd:v1

  4. webpack+vuecli使用问题总结

    1,按照官网安装步骤install $ npm install -g vue-cli $ vue init webpack my-project $ cd my-project $ npm insta ...

  5. AFNetworking 2.x 的SSL身份认证

    一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的.我们还需要防止中间人攻击(不明白的自己去 ...

  6. html-html简介

    一.什么是HTML? HypeText Markup Language:超文本标记语言,网页语言 超文本:超出文本的范畴,使用HTML可以轻松实现这样的操作 标记:HTML所有的操作都是通过标记实现的 ...

  7. 我一个自己的关于II和&&的逻辑判断(傻逼型)

    原因 首先概述下起始原因:本来埋点的数据中传递来的URL只有http://开头的数据,所以上一个编写此程序的人在定义产品ID和出发口岸时加了这样的判断 然后...悲剧(傻逼)开始了 因为业务需求,埋点 ...

  8. 技巧-如何通过hive开发平台上传csv文件

    通过数据交换平台上传较大的文件时,经常会出现导入失败情况,换种方式通过新数据开发平台(stark)也可以轻松实现外部数据与hive的数据关联. --第一步.导入csv文件到hive --stark数据 ...

  9. 从零开始搭建vue移动端项目到上线的步骤

    初始化项目 1.在安装了node.js的前提下,使用以下命令 npm install --g vue-cli 2.在将要构建项目的目录下 vue init webpack myproject(项目目录 ...

  10. linux中配置JDK环境变量

    使用的centos版本为 7.5 首先我们要把jdk拷到linux中,这里我们借助XShell工具,我们先来看看Xshell的用法 打开Xshell 后点击文件,“新建“,如下图: 起一个名称,主机填 ...