JavaWeb系列读书笔记(六)JVM内存管理

物理内存和虚拟内存

物理内存就是RAM和寄存器(用来存储计算单元执行指令的中间结果)。连接处理器和RAM或者寄存器和处理器的是地址总线。这个地址总线的宽度影响物理地址的索引范围,因为总线的宽度决定了一次可以从寄存器或者内存中获取多少个bit。
通常地址总线和寄存器和RAM有相同的位数,更容易传输数据。

一般来说如果要直接让程序直接访问存储器外,大部分是通过操作系统提供的接口来实现。但是在Java不用写和内存相关的代码。

我们运行程序都要申请内存地址。而通常操作系统管理内存是按照进程方式处理,每个进程都独享一个独立的内存空间,互不打扰,但这个互不打扰和独立性是通过操作系统来保证的。

而这个独立性更多也只是一个概念性的东西,实际上物理内存可以被多个运行进程共享,这个称为虚拟内存。

概念性大概就是计算机口头上是不承认自己的物理内存是共享的,而表面上看起来也是进程内存使用相互独立的,但是从底层的角度考虑其实物理内存是共享的。

而完成所谓的逻辑独立和实际不独立的方法就是通过虚拟内存技术,具体来说是虚拟地址。让物理内存被共享,提高内存利用,还能拓展内存的地址空间。一个进程不活动时候,会将这个进程对应的数据移动到一个磁盘文件中(通常为windows的页面文件或者是linux的交换分区),这样就腾出内存给活动程序用啦。当我们唤起这个很久没使用的程序,磁盘就开始响,而且会停顿,将磁盘中的数据重新放到物理内存中,这操作很低效率。

内存空间

内存空间会被划分成内核空间和用户空间,程序只能申请到用户空间的内存,但实际上程序也能访问到内核空间。

内核空间主要适用于操作系统运行的程序调度,虚拟内存使用,硬件资源连接等程序逻辑。就是给操作系统用的。所以用户程序不能直接访问硬件资源,要通过操作系统发起。每一次系统调用都会存在内存空间的切换,

Java堆

Java堆是用来存储Java对象的区域,堆的大小从JVM启动时就确定,可以通过-Xmx和-Xms来控制申请大小,但堆的大小申请后就不能改变

线程JVM的运行实体,每个线程创建时JVM都会为它创建一个堆栈,

类和类加载器

这两个本身就需要存储空间,他们也被存储在堆中,这种区域叫永久代?(PermGen区域)

需要注意JVM按需加载类,只会加载在应用程序指明的类,一个类一般而言只会加载一次,倘若你的类加载器是自己实现的可能会出现重复加载的情况,如果PermGen区不能堆已经失效的类做卸载,可能会导致PermGen区内存泄漏。任何系统类或者通过程序类加载器的加载的任何程序类都不能在运行时释放。

JNI 也会占用内存,使得本机代码(C语言)可以调用Java方法

JVM内存结构

JVM按照数据的存储结构来划分内存,将其分成几种不同格式的数据,分别存储在不同的区域,这些数据称为运行时数据。
运行时数据划分如下
1.PC寄存器数据
2.Java栈
3.堆
4.方法区
5.本地方法区
6.运行时常量池

PC寄存器

保存当前执行程序的内存地址,由于Java程序多线程进行,所以多线程交叉执行时,及时保存下来程序的内存地址就很重要了。

Java栈

每创建一个线程,JVM就会为这个线程创建一个对应的栈,这个栈又会含有多个栈帧。栈帧和方法相联系,每调用一个方法就创建了一个栈帧。存储一些内部变量,操作栈,返回值等信息。
Java栈顾名思义就是栈,它塞的元素是栈帧,在Java栈顶的地方才是当前执行的活动栈,一旦结束工作就会返回值然后顶部的栈帧被弹出执行下一个栈帧。Java栈不存在信息共享,所以里面的变量不用担心同步的问题

存储Java对象的地方,每一个存储在堆中的Java对象都是对象类的一个副本,堆是被所有Java线程所共享,所以应该注意同步问题。

方法区

用来存储类结构信息的地方,程序启动一段时间大小固定。是属于堆的一部分。

运行时常量池

放常量,属于方法区的一部分。

本地方法栈

为运行本地方法准备的空间,由于很多本地方法使用C语言数显,所以也叫C栈。JIT技术就是将一些Java方法重新编译成本地代码,然后哦这些编译后的本地代码就是用这个栈跟踪方法执行状态。

内存分配策略

  • 静态内存分配
  • 栈内存分配
  • 堆内存分配

静态内存分配指在程序编译时就能确定每个数据在运行时需求,然后就可以分配固定的内存空间。不允许在程序中出现可变数据结构,或者嵌套或递归,因为难以计算存储空间需求。静态内存分配效率最快。

栈内存分配也称动态分配,运行时才知道内存大小,但规定进入一个程序模块的时候就要知道数据大小并分配内存。和结构栈一样,栈式内存分配按照先进后出的形式分配

堆分配,是真正运行到相应代码才知道内存空间需求,这时候要用堆分配。

JVM内存回收策略

如何识别垃圾,只要某个对象不再被其他活动对象引用,那么这个对象就可以回收。这里活动对象指能被一个根对象集合到达的对象。

根对象集合如下:

  • 在方法中局部变量区对象的引用
  • Java操作栈的对象的引用
  • 常量池对象的引用
  • 本地方法中持有的对象的引用
  • 类的Class对象

垃圾收集算法有很多

但是大同小异,基本是基于分代的方法。

我们会将堆分成三个子堆,Young Old Perm三个区

1.Young区就是新对象申请的内存的位置。一般来说Young区会分成Eden区和Survivor区域,新生成的对象放在Eden区,当Eden区满时会触发minor GC 回收Eden区中不活动的对象,然后存活的对象会移动survivor,然后survivor满了会移动到old区。

2.一般来说,old区是来自young区的对象,但是也会出现新对象直接生成在old区的情况。当old区满了会触发Full GC机制。

3.Perm区主要是存放类的class对象。

4.Full GC会回收一切堆中不活动的对象

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容