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

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的分外

1.结构

美学原理 1

这张图片表明了,当运行java程序的时候
jvm会暴发的内存结构,而我辈一直所说的stack 和heap 就是呼应的jvm
stack和heap(heap中的新生代和老年代这篇作品中不介绍,前边一篇GC分析的时候
会去详细介绍,近来就把他看成jvm就好啊)

2.预备知识

这篇著作只假使为前面的GC分析来做基础知识扫盲的,首假使讲jvm的内存分配。从前提到过jvm的内存就分2块
一个栈(stack)一个堆(Heap),其实这多少个是错的,没有这样简单,仍旧有点小复杂的,好了来扒一扒jvm的内存

1.相关概念

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.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的时候使用的

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

1.开篇

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