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

图片 1

1.有关概念


封面人物:阿达·洛芙莱斯(Ada Lovelace)

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的内存

否计程序拟定“算法”,写来第一卖“程序设计流程图”,被赏识为“第一各类让电脑写序的口”。为了想阿达对当代电脑及软件工程所出的机要影响,美国国防部将消耗巨资、历时近20年研制成功的高等级程序语言命名吧Ada语言,它为公认为是第四代表计算机语言的根本代表。

2.JVM内存

旋即是社会风气上先是名程序员哦,大家自然要是切记了~

1.结构

图片 2

立刻张图纸表明了,当运行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

  • 基本型(int,long,char,boolean…….)

  • 对象类型的援
  • returnAddress的类型

  • Operand Stack

  • data frame
    假设要vm stack 大于了
    vm可以成熟的深浅,java会丢来stackoverflowerror的杀

Native Stack 和stack的用法差不多,但是是让java程序中跑native
language的上以的

1、首先是本人看无比好之一律篇GitHub教程,从入门到进阶都适用,真正的通俗!地址: http://www.yangzhiping.com/tech/github.html

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

2、重量级教程——progit。是github公司传道士schacon写的同等如约全面介绍github结构和以方式的开,提供多种语言翻译,但是要手动生成书。我做了汉语的电子书,大家可以一直下载上。地址:https://github.com/numbbbbb/progit-zh-pdf-epub-mobi

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的死

3、15分钟学会github,一个在线的念工具,很风趣。可以接着提示一步一步创建一个github的库房。再强调一方面,是在线的啊~地址:http://try.github.io/levels/1/challenges/1

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对应的参数。

4、git
magic,同样是同样本书,不过比progit短很多。有志愿者都翻成了中文版。地址:https://github.com/blynn/gitmagic/tree/master/zh\_cn

5、git
immersion,简洁github教程,每步信息量都无雅,可以尝尝一下。地址:http://gitimmersion.com/ 感谢@WyattWang
推荐的中文版:http://igit.linuxtoy.org/contents.html

事实上github的学科有多居多,不过考虑到新手们见状满屏的代码或者文字虽见面发怵,我选择了一部分界面比较漂亮或者内容容易懂的科目推荐给大家。

自身了解大部分总人口看了马上首文章或还非会见真去开辟就5独网址。不过我怀念说,这5单里头,你要是真的用心学其中一个不怕好学会github了。

人数与人之别在何吧?就以有人拿这些网址打开,而你一味是点击右侧上斗的X。


大家有道是的仓库一定要引进给我啊~共同进步!

接扫描二维码关注本身的微信号“GitHub不全装B指南”,获取最新篇章。

谢谢~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图