JAVA GC(垃圾回收机制)-1

1.相关概念

1.开篇

Arvin小编又来写技术博文啦,做个小小的笔记,顺便给一些人扫扫盲,最近对Java 的GC(垃圾回收机制)特别感兴趣。很早就知道在C/C++ 这类语言中需要程序猿自己去操作对内存的管理 什么 alloc, dealloc啦之类的。当初学OC的时候也有这么一章节。但是说到java很少有人会说到管理内存这块知识。java相比C语言在内存管理这块先进了好多,因为java的内存是自动管理的,光自动这个词就知道很高级有木有。但是java是怎么去创建和释放内存的呢。这个很有必要扒一扒,毕竟听说有些面试上来就问java的GC是怎么work的。还有就是这一块属于jvm的基本知识。

2.预备知识

这篇文章只要是为后面的GC分析来做基础知识扫盲的,主要是讲jvm的内存分配。以前提到过jvm的内存就分2块 一个栈(stack)一个堆(Heap),其实这个是错的,没有这么简单,还是有点小复杂的,好了来扒一扒jvm的内存

2.JVM内存

1.结构


这张图片表明了,当运行java程序的时候 jvm会产生的内存结构,而我们平时所说的stack 和heap 就是对应的jvm stack和heap(heap中的新生代和老年代这篇文章中不介绍,后面一篇GC分析的时候 会去详细介绍,目前就把他看成jvm就好啦)

1)程序计数器(Program counter Register)

The Java Virtual Machine can support many threads of execution at once. Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If themethodcurrently being executed by the thread is native , the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.

java官网给的解释,学过汇编的小伙伴应该知道cpu中的pc register 用来存储指令的地址。 其实java中的pc register的原理和汇编中的不一样但是做的是同一件事,就是记录了当前在运行指令的地址。如果java程序运行的是native language的指令则pc 里面存的是未定义。 其实pc的大小可以忽略不计因为里面存的数据量太小了。重点是要注意一下,pc register是线程私有的,所谓的线程私有就是每一个线程有一个对应的pc register,所以只有线程开始的时候 pc reigster才会创建,线程结束了 pc register自然就木有了。

2)VM stack(vm 栈)

Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames. A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.

stack 这个东西呢 也是线程私有的,随线程生随线程死。其实stack 这个东西还有下级,就是stack frame。 stack frame 是针对与方法的,简单的来说,每一个method被执行的时候会创建一个stack frame 被push到vm stack 中,方法被执行完成之后会pop出vm stack。真正存数据的地方其实是stack frame。vm stack类似一个集合。
stack frame中存了三种东西:

  • Local Vairable
  1. 基本类型(int,long,char,boolean.......)
  2. 对象类型的引用
  3. returnAddress的类型
  • Operand Stack
  • data frame
    如果请求vm stack 大于了 vm可以成熟的大小,java会抛出stackoverflowerror的异常

Native Stack 和stack的用法差不多,但是是给java程序中跑native language的时候使用的

3)Heap(堆)

The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.
The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.

堆是占内存最大一块的地方,他是线程共享的也就是说在java程序运行的时候创建的直到java程序结束。主要是存放实例对象和数组数据。也及时GC发生最多的地方。另外说一点 堆中存放的数据的物理地址不是连续的 学过汇编的小伙伴应该可以理解。如果这个地方要求的大小大于了vm 所承受的大小会保outofmemoryerror 也就是传说中的OOM

4)Method Area(方法区)

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods used in class and instance initialization and interface initialization.

方法区也是线程共享的主要是用来存储 vm 已经加载号的类信息,静态变量,等等。同时在方块区里面有一块是 常量池,也就是我们平时用final创建出来的变量都会被放到这个里面。这个地方发生GC比较少,但是如果超过大小也会抛出OOM的异常

2.栗子

上面介绍了一系列的内存分布每一块都有自己的作用和特性,我们接下来拿一个栗子来作为实例分析一下:

Object obj = new Object();

简单吧,但是深扒还是可以扒出很多东西的。拆分成2块来进行分析。
Object obj 在对应的stack frame中的local variable表中以reference类型出现。
new Object()呢 在heap中开辟了一块以存储object类型所有实例数据的内存。heap中还必须包含对应的对象型数据类型(interface,super class,class....)
reference 里面就是一个指向对象的引用所以现在的问题就是如何把他们2个链接起来(=)。有2种方法可以链接,不同的vm采用不同的方法:
方法1)指向heap中的句炳,然后由句炳指向真实的实例,什么意思呢,就是间接指向。如果是采用这种方法那么在heap中必然会开出一块存放句炳的内存



heap中2块地方 句炳池和实例池,句炳用来找到实例和对象类型数据
方法2)直接访问,就是取消了句炳了。直接存储实例的地址,直接访问到实例数据



二者的优缺点:句炳的话,如果数据发现改变移动 reference里面的值是不会变的。直接访问的话效率更好速度更快,sum hotspot vm就是用的直接访问.

第一篇文章到这里结束啦。主要介绍了vm的内存分配,如果大家要测试oom可以修改vm对应的参数。

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

推荐阅读更多精彩内容