《java Web 技术内幕》读书笔记(未完)

JVM内存管理-

线程

JVM运行实际程序的实体是线程,线程存储必要数据的内存空间为堆栈,每个线程创建时候,JVM会为它创建一个堆栈,堆栈的大小与JVM的实现有关。

JAVA堆

Java堆是用于存储java对象的内存区域,堆的大小再jvm启动时向操作系统申请一次(根据配置参数),一旦分配成功,对的大小将会固定,不能再内存不够时再向系统申请。java堆中的内存管理由JVM控制,对象创建由java应用程序控制,但是对象所占的空间释放由管理堆内存的垃圾收集器完成。
每一个存储在堆中的Java对象都会是这这个对象的副本,这个副本包括继承自它父类的所有非静态属性。
堆时所有Java线程所共享的,所以对他的访问需要注意同步问题。

方法区

属于堆的一部分(堆中的永久区),存储类结构信息的地方(常量池、域、方法数据、方法体、构造函数、专用方法、实例初始化、接口初始化)。该区域线程共享,大小可以通过参数设置。
方法区存储的信息相对比较稳定,不会频繁的被GC回收器回收。

运行时常量池

方法区的一部分

JAVA栈

java的栈跟线程相关联,每当创建一个线程时,jvm会为这个线程创建一个java栈,在这个java栈中又会有多个栈帧,栈帧与每个方法关联起来,每运行一个方法就创建一个栈帧,每个栈帧会含有一些在方法内定义的变量、操作栈和方法返回值等信息。
栈帧在方法执行完成时弹出栈中元素作为返回值,并消除这个栈,所以java栈的栈顶就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向这个地址。
操作栈只能使用当前方法的本地变量,当在一个栈桢中调用另外一个方法时,与之对应的一个新的栈桢又被创建,这个新创建的栈帧又被放到Java栈顶,变为当前的活动栈桢。
java栈与线程对应,所以栈中数据不是线程共享的。

内存分配策略

JVM内存分配主要基于堆、栈。(操作系统的分配策略分为静态内存分配以及栈、堆内存分配)

栈的分配和线程绑定在一起,创建一个线程时,便会创建一个栈,线程方法的调用、返回对应栈的压栈和出栈。栈桢用于保存参数、局部变量、中间计算过程和其它数据(主要还是为基本类型的变量以及对象的引用),存取速度块,仅次于寄存器。

所有对象或数组的存储空间都是在堆中分配的(对象的引用存储空间在栈中),每个java应用对应一个JVM实例,每个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由运用程序所有的线程共享。
堆内存是自动初始化的,java的堆是一个运行时数据区,运行时动态分配内存,由GC回收器负责空间的释放。
堆由于在分配、销毁内存时候需要经过操作系统,期间占用的时间导致用堆的效率非常低。堆的优点在于不必知道所需的存储空间的大小以及存活时长,因此堆更加的方便。除此之外,由于面向对象编程的多态性,多态变量所需的存储空间只有在运行时创建了对象之后才能确定。

内存回收策略

静态内存回收

在java的类和方法中的局部变量包括原生数据类型和对象的引用都是静态分配内存的,这些数据的大小固定且内存不会在程序执行时发生变化,所以其总内存总需求在java被编译时便能够确定下来,在程序被加载时系统便把该部分的内存一次性的分配完,直到程序执行结束时,这部分内存才会被回收。

动态内存回收

Java中的对象的内存空间,只有在程序执行过程中,JVM解析了类后才能知道该对象所属的类有哪些信息,然后才能为这些信息分配相应的存储空间存储相应的值。此类空间在对象不再使用时被回收,即是说以对象不再被引用为前提。

垃圾识别

JVM检查堆中所有对象是否都会被活动对象变量直接或者间接引用,不被活动对象变量引用的对象便是垃圾。
活动对象变量:

  • 方法中局部变量区的对象变量:这些对象变量存储在栈桢的局部变量区
  • java操作栈中的对象变量:某些对象在操作栈中持有
  • 常量池中的对象变量:这个指的是类的实例域中包含的对象变量
  • 本地方法中持有的对象变量:有些对象被传入本地方法中,但是这些对象还没有被释放
  • 类的Class对象变量:每个类被JVM加载时都会创建一个代表这个类的唯一数据类型的Class对象,这个对象存放在堆中,当这个类不再被使用时,方法区中的类数据和这个对象需要被回收
    垃圾收集算法参考

JVM内存相关部分总结

大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 )。
其中Method Area方法区和Heap堆是线程共享的,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因

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

推荐阅读更多精彩内容