文档章节

006. 深入JVM学习—年轻代

易冥天
 易冥天
发布于 06/22 17:22
字数 872
阅读 16
收藏 7

1. 年轻代图片


  • 年轻代(Young)属于JVM堆内存空间的一个组成部分

年轻代

  1. 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了几次Minor GC还保存下来的活跃对象。那么这个对象将晋升到 存活区之中。

  2. 存活区分成两块内存空间,并且空间大小相等,目的是:一块存活区为了晋升、另外一块存活区为了对象回收。这两块内存空间一定有一块是空的。

2. 年轻代GC(Minor GC)实现算法—复制算法(Copying)


  • 算法:复制采用的方式为从根集合扫描出存活的对象,并将找到的存活对象复制到一块新的完全未使用的空间中。

  • 红色为不存活的对象所占用的内存空间,绿色为存活对象所占用的内存空间。

    GC实现算法

    GC实现算法

3. 年轻代优化算法


  • 由于Eden区总会保存大量的新生对象或大量临时对象,会频繁执行Minor GC,所以HotSpot虚拟机为了加快此空间的内存分配,使用了以下两种技术:
  1. Bump-The-Pointer

    • 该技术的主要特点是跟踪在Eden区保存的最后一个对象,这个最后保存的对象一般会保存在Eden区的顶部,这样每次创建新对象时只需要检查最后保存的对象后面是否有足够的空间就可以很快地判断出Eden区中是否还有剩余空间,这种做法可以极大地提高内存分配速度。

    Bump-The-Pointer

  2. TLAB(Thread-Local Allocation Buffers)

    • 虽然“Bump-The-Pointer”算法可以提高内存的分配速度,但是这种做法并不适合多线程的操作情况。所以又采用了“TLAB”算法将Eden区分为多个数据块,每个数据块分别使用“Bump-The-Pointer”技术进行对象保存于内存分配。

    TLAB

4. 年轻代内存调整参数


No.参数名称描述
01-Xmn设置年轻代堆内存大小,默认为物理内存的 1/64
02-Xss设置每个线程栈大小,JDK1.5之后默认为每个线程分配1M的栈大小,减少此数值可以产生更多的线程对象,但是不能无限生成
03-XX:SurvivorRatio设置Eden与Survivor空间的大小比例,默认 8:1:1,不建议修改
04-XX:NewSize设置新生代内存区大小
05-XX:NewRatio设置年轻代与老年代的比率

5. 范例:改变存活区的比率


  • 代码

    public class TestDemo {
        public static void main(String[] args) {
    
        }
    }
    
  • 终端运行

    > javac TestDemo.java
    > java -Xmx10M -Xms10M -XX:SurvivorRatio=6 -XX:+PrintGCDetails TestDemo
    
  • 运行结果(存在一定误差)

    Heap
     PSYoungGen      total 2560K, used 975K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
      eden space 2048K, 47% used [0x00000000ffd00000,0x00000000ffdf3ca0,0x00000000fff00000)
      from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
      to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
     ParOldGen       total 7168K, used 0K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
      object space 7168K, 0% used [0x00000000ff600000,0x00000000ff600000,0x00000000ffd00000)
     Metaspace       used 2559K, capacity 4486K, committed 4864K, reserved 1056768K
      class space    used 281K, capacity 386K, committed 512K, reserved 1048576K
    

© 著作权归作者所有

共有 人打赏支持
易冥天
粉丝 31
博文 139
码字总数 70641
作品 0
海淀
程序员
私信 提问
JVM系列第6讲:Java 虚拟机内存结构

看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了。那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了。在这个...

陈树义
前天
0
0
JVM系列开篇:为什么要学虚拟机?

跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现...

陈树义
11/06
0
0
【转】Java之 内存区域和GC机制

转自:Leo Chin 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况    Java GC(Garbage Collection,垃圾收集,垃圾回收...

rayner
2016/03/09
0
0
003. 深入JVM学习—Java堆内存模型

GC收集原理 --- 对不需要的对象进行处理标记,而后进行清除。 2. JVM堆内存划分 --- JDK1.8 以前 JDK1.8 以后 在JDK1.8之后将最初的永久代内存空间取消,取消永久代的目的是为了将HotSpot和J...

影狼
06/22
0
0
我所理解的JVM(一):内存结构

Java Memory Model 简称JMM,译为Java内存模型,属于Java虚拟机规范的一部分 java虚拟机运行时的内存区域分为:程序计数器、虚机机栈、本地方法栈、堆、方法区5部分。其中前3部分是线程独享的...

康斯但丁
2017/10/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
3
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部