文档章节

006. 深入JVM学习—年轻代

影狼
 影狼
发布于 06/22 17:22
字数 872
阅读 14
收藏 7
点赞 1
评论 0

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
博文 133
码字总数 65034
作品 0
海淀
程序员
JDK的命令行工具系列 (一) jps、jstat

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

qingshanli
07/15
0
0
003. 深入JVM学习—Java堆内存模型

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

影狼
06/22
0
0
JVM性能优化, Part 3 垃圾回收

ImportNew注:本文是JVM性能优化 系列-第3篇-《JVM性能优化, Part 3 —— 垃圾回收》 第一篇 《JVM性能优化, Part 1 ―― JVM简介 》 第二篇《JVM性能优化, Part 2 ―― 编译器》 Java平台...

梁杰_Jack
2014/10/30
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
07/17
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
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

基于Sun HotSpot JVM 这里将介绍几款sun hotspot jvm 自带的监控工具: 请确保java_home/bin配置到path环境变量下,因为这些工具都在jdk的bin目录下 jps(JVM Process Status Tool):JVM机进程...

我类个擦
2014/09/12
0
1
java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 的区别

Eclipse崩溃,错误提示: MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains. It is strongly recommended that you exit and restart M......

大数据之路
2013/04/15
0
1
Java系列笔记 - JVM监控与调优

光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之。通过学习,我觉得JVM监控与调优主要的着眼点在于如何配置、如何监控、如何优化3点上。下面就...

明舞
2015/08/18
0
0
Java系列笔记 - Java 内存区域和GC机制

Java垃圾回收概况   Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢...

明舞
2015/08/18
0
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java 之 枚举

Java 中声明的枚举类,均是 java.lang.Enum 类的子类,Enun 类中的常用方法有: name() 返回枚举对象名称 ordinal() 返回枚举对象下标 valueOf(Class enumType, String name) 转换枚举对象 ...

绝世武神
8分钟前
0
0
使用爬虫实现代理IP池之放弃篇

啥叫代理IP以及代理IP池 概念上的东西网上搜索一下就好了,这里简单科普一下(大部分会读这篇文章的人,基本是不需要我来科普的),白话说就是能联网并提供代理访问互联网的服务器,它提供的...

一别丶经年
24分钟前
0
0
rabbitmq学习记录(五)交换机Exchange-fanout

之前学习的都是一条消息发给一个消费者,下面开始记录如何把一条信息发给多个消费者 这边我们用到了交换机Exchange 交换机模式:fanout 模式特点:生产者把消息发送给Exchange之后,Exchang...

人觉非常君
45分钟前
0
0
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 Sqoop Hive HBase 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用复杂SQL 调整Hive数据类型 不断更新 ...

hblt-j
51分钟前
0
0
Dart 服务端开发 文件上传

clent端使用angular组件 upload_component.html form id="myForm" method="POST" enctype="multipart/form-data"> <input type="file" name="fileData"> <!-- file field --></form>......

scooplol
51分钟前
0
0
apache和tomcat同时开启,乱码问题

tomcat和apache同时开启,会走apache的转发,执行的是AJP/1.3协议。所以在tomcat的配置文件server中, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForU......

Kefy
今天
0
0
使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录 和ssh常用命令

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利 第一步...

xtof
今天
0
0
orcale 查询表结构

SELECT t.table_name, t.colUMN_NAME, t.DATA_TYPE || '(' || t.DATA_LENGTH || ')', t1.COMMENTS FROM User_Tab_Cols t, User_Col_Comments t1WHERE t.table_name......

wertwang
今天
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
今天
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部