b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Java把内存分成两种:栈内存和堆内存的区别

电脑杂谈  发布时间:2021-05-16 02:02:09  来源:网络整理

Java堆是所有线程共享的内存区域。所有对象和数组都分配在堆上。为了执行有效的垃圾回收,虚拟机将堆内存划分为三个区域:年轻一代,老一代和永久一代(1. 8没有永久一代,并且使用元空间实现)。

jvm堆内存

Java将内存分为两种类型:堆栈内存和堆内存。关于堆内存和堆栈内存之间的区别和连接。简而言之,堆内存用于存储new创建的对象和数组,堆中分配的内存由java虚拟机的自动垃圾收集器管理。堆栈内存由用户应用到系统,然后由申请人进行管理。

堆内存初始化

Java中堆内存的分配会自动初始化,并且其入口位于Universe :: initialize_heap方法中。相关代码如下:

jvm堆内存

其中,可以通过启动参数设置UseParallelGC,UseG1GC,UseConcMarkSweepGC。整个初始化过程分为三个步骤:1、初始化GC策略; 2、初始化生成; 3、初始化Java堆管理器;

GC策略初始化

HotSpot的GC策略的实现方式如下:

jvm堆内存

MarkSweepPolicy是基于标记扫描思想的GC策略。如果虚拟机启动参数未指定GC算法,则使用默认的UseSerialGC。以ASConcurrentMarkSweepPolicy策略为例,分析GC策略的初始化过程:

调用父类ConcurrentMarkSweepPolicy构造方法,其中initialize_all在GenCollectorPolicy中定义,相关代码如下:

jvm堆内存

initialize_flags

负责调整新一代,旧一代和永久一代的内存大小。

调整永久世代

由CollectorPolicy :: initialize_flags实现,默认情况下,永久代的初始值为4M,最大值为64M,可以通过参数-XX:PermSize和-XX:MaxPermSize进行重置。代码如下:

jvm堆内存

调整新一代

由GenCollectorPolicy :: initialize_flags实施:1、缺省情况下,新一代NewSize的初始值为1M,并且需要设置最大值,可以通过参数-XX:NewSize和-XX进行设置: MaxNewSize或-Xmn; 2、 NewRatio是旧一代与新一代的大小比例,默认为2; 3、 SurvivorRatio是新一代Eden和Survivor的大小比,默认值为8;

jvm堆内存

调整年龄

由TwoGenerationCollectorPolicy :: initialize_flags 1、实现。默认情况下,旧版OldSize的初始值为4M,可以通过参数-XX:OldSize设置。 2、默认情况下,最大堆大小MaxHeapSize为96M,可以通过参数-Xmx来设置; 3、如果新一代内存和旧内存容量大于MaxHeapSize,请重置MaxHeapSize;

jvm堆内存

initialize_size_info

设置幼年,老年和永久世代的容量,包括初始值,最小值和最大值

设置堆容量

InitialHeapSize和参数:: min_heap_size()可以通过参数-Xms设置。 1、设置初始堆容量_initial_heap_byte_size; 2、设置最小堆容量_min_heap_byte_size; 3、设置最大堆容量_max_heap_byte_size;

相关代码如下:

jvm堆内存_jvm堆内存_java堆内存和栈内存

jvm堆内存

设置新一代

jvm堆内存

1、如果已重置MaxNewSize,即设置了-Xmn参数,则会根据不同情况设置max_new_size;否则,将重新设置。 2、否则,将通过scale_by_NewRatio_aligned方法根据NewRatio和_max_heap_byte_size重新计算max_new_size的值,其中NewRatio默认为2,这意味着新学生世代大小占整个堆的1/3;

jvm堆内存

3、如果最大堆_max_heap_byte_size等于最小堆_min_heap_byte_size,则将新一代的初始值,最小值和最大值设置为max_new_size,否则转到下一步。

jvm堆内存

4、如果重置了NewSize,即设置了-Xmn参数,请使用NewSize设置_min_gen0_size,否则使用scale_by_NewRatio_aligned方法重新计算新一代的最小值和初始值,实现方式如下如下:

jvm堆内存

设置年龄

1、如果该参数未设置OldSize,请使用min_heap_byte_size()-min_gen0_size(),即最小堆大小和最小年轻代数之间的差值来设置最小年龄(初始值)值相似; 2、否则根据设置OldSize,通过adjust_gen0_sizes方法重置新一代的最小值和初始值;

初始化发电发电机

世代保存每个内存世代的初始值和最大值。新一代和旧一代由GenerationSpec实现,永久一代由PermanentGenerationSpec实现。

GenerationSpec

jvm堆内存

每个GenerationSpec实例都保存当前生成的GC算法,内存的初始值和最大值。

PermanentGenerationSpec

jvm堆内存

除了GenerationSpec实例中的数据外,如果设置UseSharedSpaces和DumpSharedSpaces,则还需要保存其他数据。 ConcurrentMarkSweepPolicy :: initialize_generations方法实现世代的初始化,该实现如下:

jvm堆内存

初始化Java堆管理器

GenCollectedHeap是整个Java堆的管理器,负责Java对象的内存分配和垃圾对象的回收。它是通过initialize方法初始化的。相关代码如下:

jvm堆内存

1、通过GC策略的number_of_generations方法获得世代数。如果使用ASConcurrentMarkSweepPolicy,则默认的世代数为2;否则为0。 2、通过align方法对齐发生器的初始值和最大值;

jvm堆内存

3、通过分配为堆申请空间;

jvm堆内存

4、通过世代的init方法为相应世代分配内存空间;

5、如果当前的GC策略是ConcurrentMarkSweepPolicy,请通过create_cms_collector创建一个GC线程。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-375738-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...