File tree Expand file tree Collapse file tree 3 files changed +45
-0
lines changed
Expand file tree Collapse file tree 3 files changed +45
-0
lines changed Original file line number Diff line number Diff line change 1+
2+
3+
4+ ## 堆内存
5+
6+ 1.配置新生代和老年代堆结构占比
7+ > -XX: NewRatio =2
8+
9+ 默认 ** -XX: NewRatio =2** , 标识新生代占1 , 老年代占2 ,新生代占整个堆的1/3
10+ 修改占比 -XX: NewPatio =4 , 标识新生代占1 , 老年代占4 , 新生代占整个堆的1/5
11+
12+ 2.Eden空间和另外两个Survivor空间占比分别为8:1:1;新生代 (Young) 被细分为Eden和两个Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。默认的,Eden:from: to =8:1:1(可以
13+ 通过参数–XX: SurvivorRatio 来设定
14+ > -XX: SurvivorRatio =8
15+
16+ 3.堆大小 = 新生代 + 老年代,配置堆内存大小,堆的大小可以通过参数 –Xms、-Xmx 来指定
17+ > -Xms5m -Xmx20m #当下Java应用最大可用内存为20M, 最小内存为5M
18+
19+ 4.新生代设置大小
20+ > Young Gen -Xmn
21+
22+ 5.本地内存元空间Metaspace中
23+ > -XX: MetaspaceSize -XX: MaxMetaspaceSize
24+
25+ 6.设置虚拟机栈的大小,-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
26+ > -Xss1m
Original file line number Diff line number Diff line change 1+ ## 为什么JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务
2+ JVM(Java虚拟机)在内存管理方面使用了分代垃圾回收策略,其中新创建的对象通常位于年轻代(Young Generation)中的Eden区域。为了更好地理解为什么JVM每次只会使用Eden和其中的一块Survivor区域来为对象服务,我们需要了解年轻代的垃圾回收过程。
3+ 在年轻代中,通常有一个Eden区和两个Survivor区(通常称为From和To区,或者称为S0和S1区)。当对象被创建时,它们会被分配到Eden区域。当Eden区域填满时,会触发Minor GC(年轻代垃圾回收),其中存活的对象将被移动到Survivor区域中的一个区域(通常是To区)。
4+
5+ 为什么只使用Eden和其中一个Survivor区域来为对象服务的原因如下:
6+
7+ 空间效率:使用两个Survivor区域的目的是为了在进行垃圾回收时,将存活的对象复制到另一个Survivor区域中,同时清空当前使用的Survivor区域。这样可以保持年轻代的连续空间,减少了碎片化问题。
8+
9+ 避免并发冲突:在进行垃圾回收时,只使用Eden和其中一个Survivor区域可以避免多个区域之间的并发冲突。如果同时使用两个Survivor区域进行垃圾回收,可能会导致并发冲突和数据不一致的问题。
10+
11+ 性能优化:将对象从一个Survivor区域复制到另一个Survivor区域时,只需要简单地复制内存中的对象指针,而不需要对对象进行复制或重建。这样可以提高垃圾回收的性能。
12+
13+ 需要注意的是,当对象在Survivor区域中经历了一定数量的垃圾回收后,它们可能会晋升到老年代(Old Generation)。这是为了避免短时间内频繁地将对象从年轻代复制到Survivor区域,降低垃圾回收的效率。
14+
15+ 总结起来,JVM每次只使用Eden和其中的一块Survivor区域来为对象服务,是为了提高空间效率、避免并发冲突,并优化垃圾回收的性能。
16+
17+ ## jvm的内存如何分配,在哪分配
18+
19+ ## 新生代实际可用空间占总新生代的多少
You can’t perform that action at this time.
0 commit comments