JAVA GC(垃圾回收机制)-1Java内存区域及内存溢出异常。

1.有关概念

Java虚拟机,以下简称JVM。

1.开篇

Arvin小编又来写技术博文啦,做只细微笔记,顺便让一些口扫扫盲,最近对Java
的GC(垃圾回收机制)特别感谢兴趣。很已经知道当C/C++
这好像语言中待程序猿自己失去操作对内存的保管 什么 alloc,
dealloc啦之类的。当初学OC的早晚啊闹诸如此类一章节节。但是说到java很少有人会说交管理内存这块文化。java相比C语言在内存管理这块先进了多,因为java的内存是机动管理之,光机关这个词就知道老高档有麻痹有。但是java是怎么去创造与自由内存的吧。这个深有必要扒一扒,毕竟听说有些面试上来就问java的GC是怎么work的。还有即使是马上等同块属于jvm的基本知识。

JVM以尽java程序的进程被会将她所管理的内存划分也多少个区域。

2.准备知识

当即首文章一经是吗后面的GC分析来开基础知识扫盲的,主要是讲jvm的内存分配。以前提到过jvm的内存就分割2块
一个仓库(stack)一个堆(Heap),其实这是错的,没有如此简单,还是产生硌多少复杂的,好了来扒一扒jvm的内存

这些区域发生独家的生命周期。有的拄让JVM,有的因让用户线程。

2.JVM内存

6片区域组成。

1.结构

澳门萄京娱乐场 1

当时张图表明了,当运行java程序的下
jvm会产生的内存结构,而我辈平素所说的stack 和heap 就是对应的jvm
stack和heap(heap中之新生代与始终年代就首文章中莫介绍,后面同样首GC分析的时
会去详细介绍,目前即使管他当作jvm就吓哪)

次第计数器 The pc Register

JVM可以同时支持多履线程。每个JVM线程有和好之主次计数器。任何时候,每个JVM线程执行单个方法的代码,叫做那个线程的脚下方式。如果生方式不是当地的,那么程序计数器包含当前JVM正在履行之通令地址。如果被这个线程当前实施的法是地面的,那么JVM的先后计数器的值是undefined。JVM的次第计数器足够去有一个归地址或者一个本土指针在指定的平台。翻译自JVM规范。

简短来说

JVM执行非本地方法,它的程序计数器存指令地址。

JVM执行本地方法,它的先后计数器存值undefined。

tag:线程隔离的数据区

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自然就木有矣。

Java虚拟机栈 Java Virtual Machine Stacks

每个JVM线程有一个民用JVM栈,与线程一起被创造。一个JVM栈存frames。一个JVM栈是看似于传统语言C的库房:它发生地面变量和局部变量,在章程调用和归中于在作用。因为JVM栈从不直接叫操作除了加大与取frames,frames按照堆放置。对于JVM栈内存不欲用到。

先是版java虚拟机规范被,JVM栈叫Java栈。

这标准允许JVM栈是一定大小或者是动态扩展及基于计算的得。

假设JVM栈大小是定点的,每个JVM栈被单独的选取当栈被创造时。

每个JVM实现好提供程序要用户控制因JVM栈的上马大小,同样的动态扩展的要么contractingJVM栈,控制在最酷以及无限小尺寸。

下是JVM栈的死去活来条件

使算后线程要求一个再度要命的JVM栈比打所许的,JVM抛来StackOverflowError.

如果JVM栈是动态扩展的,当扩展中并未足够的内存还是没有足够的内存去初始化JVM栈的一个线程,JVM抛出OutOfMemoryError

大概的话

JVM中每个线程有一个JVM栈,与线程一起吃创造。每个JVM栈用来存frames。

frame is used to store data and partial results, as well as to
perform dynamic linking, return values for methods, and dispatch
exceptions.

 Local Variables

Operand Stacks

 Dynamic Linking

Normal Method Invocation Completion

Abrupt Method Invocation Completion

frames

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的上用的

java 堆 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
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.

A Java Virtual Machine implementation may provide the programmer or the
user control over the initial size of the heap, as well as, if the heap
can be dynamically expanded or contracted, control over the maximum and
minimum heap size.

The following exceptional condition is associated with the
heap:

If a computation requires more heap than can be made available by the
automatic storage management system, the Java Virtual Machine throws
an OutOfMemoryError.

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

方法区 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
(§2.9)
used in class and instance initialization and interface initialization.

The method area is created on virtual machine start-up. Although the
method area is logically part of the heap, simple implementations may
choose not to either garbage collect or compact it. This specification
does not mandate the location of the method area or the policies used to
manage compiled code. The method area may be of a fixed size or may be
expanded as required by the computation and may be contracted if a
larger method area becomes unnecessary. The memory for the method area
does not need to be contiguous.

A Java Virtual Machine implementation may provide the programmer or the
user control over the initial size of the method area, as well as, in
the case of a varying-size method area, control over the maximum and
minimum method area size.

The following exceptional condition is associated with the method
area:

If memory in the method area cannot be made available to satisfy an
allocation request, the Java Virtual Machine throws an OutOfMemoryError.

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的不可开交

运转时量池 Run-Time Constant Pool

run-time constant pool is a per-class or per-interface run-time
representation of the constant_pool table in a class file
(§4.4).
It contains several kinds of constants, ranging from numeric literals
known at compile-time to method and field references that must be
resolved at run-time. The run-time constant pool serves a function
similar to that of a symbol table for a conventional programming
language, although it contains a wider range of data than a typical
symbol table.

运行时量池是每个接近还是每个接口在相近公事的常量池表的周转时表示。他带有了几种常量,从编译时之数字文字及方式和援字段,必须以运作时解决。运行时量池服务方程式类似于健康编程语言的标志表,尽管她蕴含了一个要命范围的多寡而休是突出的符号表。

Each run-time constant pool is allocated from the Java Virtual
Machine’s method area
(§2.5.4).
The run-time constant pool for a class or interface is constructed when
the class or interface is created
(§5.3)
by the Java Virtual Machine.

The following exceptional condition is associated with the construction
of the run-time constant pool for a class or
interface:

When creating a class or interface, if the construction of the run-time
constant pool requires more memory than can be made available in the
method area of the Java Virtual Machine, the Java Virtual Machine throws
an OutOfMemoryError.

See §5 (Loading, Linking, and
Initializing
) for
information about the construction of the run-time constant pool.

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

地方方法栈 Native Method Stacks

An implementation of the Java Virtual Machine may use conventional
stacks, colloquially called “C stacks,” to support native methods
(methods written in a language other than the Java programming
language). Native method stacks may also be used by the implementation
of an interpreter for the Java Virtual Machine’s instruction set in a
language such as C. Java Virtual Machine implementations that cannot
load nativemethods and that do not themselves rely on conventional
stacks need not supply native method stacks. If supplied, native method
stacks are typically allocated per thread when each thread is created.

This specification permits native method stacks either to be of a fixed
size or to dynamically expand and contract as required by the
computation. If the native method stacks are of a fixed size, the size
of each native method stack may be chosen independently when that stack
is created.

A Java Virtual Machine implementation may provide the programmer or the
user control over the initial size of the native method stacks, as well
as, in the case of varying-size native method stacks, control over the
maximum and minimum method stack sizes.

The following exceptional conditions are associated with native method
stacks:

If the computation in a thread requires a larger native method stack
than is permitted, the Java Virtual Machine throws
a StackOverflowError.

If native method stacks can be dynamically expanded and native method
stack expansion is attempted but insufficient memory can be made
available, or if insufficient memory can be made available to create the
initial native method stack for a new thread, the Java Virtual Machine
throws an OutOfMemoryError.

参考

深切明Java虚拟机 周志明 著

JVM规范链接

相关文章

发表评论

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