文档章节

006. 深入JVM学习—年轻代

易冥天
 易冥天
发布于 06/22 17:22
字数 872
阅读 14
收藏 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
博文 138
码字总数 70277
作品 0
海淀
程序员
003. 深入JVM学习—Java堆内存模型

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

影狼
06/22
0
0
【转】Java之 内存区域和GC机制

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

rayner
2016/03/09
0
0
JDK的命令行工具系列 (一) jps、jstat

概述 在我们进行故障定位和性能分析时, 可以使用Java Dump(也叫Dump文件)来帮助排查问题, 它记录了JVM运行期间的内存占用和线程执行等情况。其中Heap Dump文件是二进制格式, 它保存了某一时刻...

qingshanli
07/15
0
0
JAVA虚拟机 JVM 详细分析 原理和优化(个人经验+网络搜集整理学习)

JVM是java实现跨平台的主要依赖就不具体解释它是什么了 ,简单说就是把java的代码转化为操作系统能识别的命令去执行,下面直接讲一下它的组成 1.ClassLoader(类加载器) 加载Class 文件到内...

小海bug
06/14
0
0
我所理解的JVM(一):内存结构

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

康斯但丁
2017/10/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部