堆放实例对象,栈放实例对象的引用,方法区存储创建类的信息

上面堆和垃圾回收的关系,垃圾回收回收的是堆内存的数据,s0和s1区域,

例如现在我们要清除s0中的堆对象,将s0中正在运行的对象从s0区域移动到s1区域中,然后将s0中要被清除的堆对象清除,现在对象都存储在s1中,s0中为空,即下来要清除s1中的对象,将不被清除的对象从s1中移动到s0中,将s1中的对象清除,依次类推

接下来学习下虚拟机的参数:

1、第一点给堆设置参数

-Xms5m -Xmx20m

初始化堆大小5m,最大设置为20M,-XX:+PrintCommandLineFlags将配置的参数从控制台打印输出

配置参数:

我们来看下面代码的运行结果:

package com.bjsxt.base001;

public class Test01 {

    public static void main(String[] args) {

        //-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

        //查看GC信息
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); byte[] b1 = new byte[1*1024*1024];
System.out.println("分配了1M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); byte[] b2 = new byte[4*1024*1024];
System.out.println("分配了4M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); } }

-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC
max memory:20316160
free memory:4418752
total memory:5111808
[GC[DefNew: 676K->127K(1536K), 0.0014042 secs] 676K->481K(4992K), 0.0014266 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
分配了1M
max memory:20316160
free memory:3541280
total memory:5111808
[GC[DefNew: 1180K->0K(1536K), 0.0010578 secs][Tenured: 1505K->1505K(3456K), 0.0022471 secs] 1533K->1505K(4992K), [Perm : 2511K->2511K(21248K)], 0.0033312 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
分配了4M
max memory:20316160
free memory:3625944
total memory:9441280
Heap
def new generation total 1664K, used 108K [0x00000000f9a00000, 0x00000000f9bc0000, 0x00000000fa0a0000)
eden space 1536K, 7% used [0x00000000f9a00000, 0x00000000f9a1b100, 0x00000000f9b80000)
from space 128K, 0% used [0x00000000f9b80000, 0x00000000f9b80000, 0x00000000f9ba0000)
to space 128K, 0% used [0x00000000f9ba0000, 0x00000000f9ba0000, 0x00000000f9bc0000)
tenured generation total 7556K, used 5601K [0x00000000fa0a0000, 0x00000000fa801000, 0x00000000fae00000)
the space 7556K, 74% used [0x00000000fa0a0000, 0x00000000fa618670, 0x00000000fa618800, 0x00000000fa801000)
compacting perm gen total 21248K, used 2520K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 11% used [0x00000000fae00000, 0x00000000fb076370, 0x00000000fb076400, 0x00000000fc2c0000)
No shared spaces configured.

[GC[DefNew: 1180K->0K(1536K), 0.0010578 secs][Tenured: 1505K->1505K(3456K), 0.0022471 secs] 1533K->1505K(4992K), [Perm : 2511K->2511K(21248K)], 0.0033312 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]

表示进行了垃圾回收,DefNew表示回收了新生代,Tenured表示回收了老年代,Perm 表示回收了永久区

新生代会频繁被GC不稳定,新生代包含eden空间 s1 和s0空间

我们来看下面的列子:

package com.bjsxt.base001;

public class Test02 {

    public static void main(String[] args) {

        //第一次配置
//-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC //第二次配置
//-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC //第三次配置
//-XX:NewRatio=老年代/新生代
//-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC byte[] b = null;
//连续向系统申请10MB空间
for(int i = 0 ; i <10; i ++){
b = new byte[1*1024*1024];
}
}
}

程序运行的效果是:

[GC[DefNew: 512K->255K(768K), 0.0013618 secs] 512K->439K(20224K), 0.0013894 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 768K, used 428K [0x00000000f9a00000, 0x00000000f9b00000, 0x00000000f9b00000)
eden space 512K, 33% used [0x00000000f9a00000, 0x00000000f9a2b300, 0x00000000f9a80000)
from space 256K, 99% used [0x00000000f9ac0000, 0x00000000f9affff8, 0x00000000f9b00000)
to space 256K, 0% used [0x00000000f9a80000, 0x00000000f9a80000, 0x00000000f9ac0000)
tenured generation total 19456K, used 10424K [0x00000000f9b00000, 0x00000000fae00000, 0x00000000fae00000)
the space 19456K, 53% used [0x00000000f9b00000, 0x00000000fa52e040, 0x00000000fa52e200, 0x00000000fae00000)
compacting perm gen total 21248K, used 2517K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 11% used [0x00000000fae00000, 0x00000000fb075440, 0x00000000fb075600, 0x00000000fc2c0000)
No shared spaces configured.

eden space 512K,from space 256K是 比例是2,SurvivorRatio=2 就是这个含义设置的意思 xmn表示新生代的值设置成1M,from区域就是s0区域,to区域就是s1区域,二者的大小是一样的

eden space 512K, 33% used [0x00000000f9a00000, 0x00000000f9a2b300, 0x00000000f9a80000)
from space 256K, 99% used [0x00000000f9ac0000, 0x00000000f9affff8, 0x00000000f9b00000)
to space 256K, 0% used [0x00000000f9a80000, 0x00000000f9a80000, 0x00000000f9ac0000)

上面三者之和就是1M

真正在应用的场景中,已经尽量减少GC,将初始化的内存大小和最大内存大小配置成一样,这样可以减少GC

package com.bjsxt.base001;

import java.util.Vector;

public class Test03 {

    public static void main(String[] args) {

        //-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump
//堆内存溢出
Vector v = new Vector();
for(int i=0; i < 5; i ++){
v.add(new Byte[1*1024*1024]);
} }
}

上面这个代码我申请5M的内存,但是在设置的时候却是

/-Xms1m -Xmx1m 设置成1M,就会出现堆内存异常,使用-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath就会将信息导出来查看

package com.bjsxt.base001;

public class Test04 {

    //-Xss1m
//-Xss5m //栈调用深度
private static int count; public static void recursion(){
count++;
recursion();
}
public static void main(String[] args){
try {
recursion();
} catch (Throwable t) {
System.out.println("调用最大深入:" + count);
t.printStackTrace();
}
}
}

运行结果:

调用最大深入:12560
java.lang.StackOverflowError

jvm基础知识1的更多相关文章

  1. JVM 基础知识

    JVM 基础知识(GC) 2013-12-10 00:16 3190人阅读 评论(1) 收藏 举报 分类: Java(49) 目录(?)[+] 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看 ...

  2. JVM基础知识(1)-JVM内存区域与内存溢出

    JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...

  3. JVM基础知识总结

    因为没深入搞底层研究,所以也就没做很细致的笔记.相关笔记内容是直接从度娘那儿来的,重新删减.整理和加了点自己的东西. 1.JVM(Java Virtual Machine)是什么:JVM是一种用于计算 ...

  4. 【转】JVM 基础知识

    几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程,所谓的“温故而知新”.而真正能走完这个轮回的人,也就能 ...

  5. JVM基础知识GC

    在网上看到一篇很不错的讲解JVM GC的文章,看完之后觉得可以留着以后多看几遍便转载了下来.但是找了半天也没有找到原作者地址.抱歉不能标明原文地址了.以下是文章内容. 几年前写过一篇关于JVM调优的文 ...

  6. JVM基础知识及拓展

    我们可以吧JVM的基本结构分为四块:类加载器.执行引擎.运行时数据区和本地接口.一般来说Java程序在JVM中的执行流程如下: ①.首先我们会利用javac命令将我们所编写的.java源代码文件变异成 ...

  7. JVM 基础知识(GC)

    几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程,所谓的"温故而知新".而真正能走完 ...

  8. jvm基础知识—垃圾回收机制

    1.首先类的实例化.static.父类构造函数执行顺序 我们来看下面的程序代码: public class A { int a1 = 8; { int a3 = 9; System.out.print ...

  9. JVM基础知识

    JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.J ...

  10. JVM基础知识与配置

    1 怎样设置JVM内存设置 本文向大家简介一下进行JVM内存设置几种方法.安装Java开发软件时.默认安装包括两个目录,一个JDK(Java开发工具箱).一个JRE(Java执行环境,内含JVM),当 ...

随机推荐

  1. PHP生成指定范围的日期

    /** * 生成指定范围的日期 * * @param $string $startDate 开始日期 2020-01-01 * @param $string $endDate 结束日期 2020-01 ...

  2. CVE-2016-3714-ImageMagick 漏洞利用

    漏洞简介:/etc/ImageMagick/delegates.xml 将%s,%l加入到command里造成了命令执行 利用方式: poc代码: push graphic-context viewb ...

  3. GNS3内网通过cloud与实际网络实现互连互通的实验(使用环回网口)

    一.背景: 在GNS3内构建一个测试网络,该测试网络的设备能够通过cloud访问外部网络设备和Internet网,外部网络也能直接访问GNS3内网的设备. 考虑通过cloud上的环回口连接GNS3内网 ...

  4. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  5. Rocket - tilelink - Fragmenter

    https://mp.weixin.qq.com/s/kNQrhlf33AErK7IzalnUDw   简单介绍Fragmenter的实现.   ​​   1. 基本介绍   用于把上游节点地址空间范 ...

  6. AUTOSAR-PDU&SDU

    https://mp.weixin.qq.com/s/TZcJcHVnNARMcUac2Es0wQ   PDU: Protocol Data Unit The PDU contains SDU and ...

  7. Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)

    552. 学生出勤记录 II 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值. 学生出勤记录是只包含以下三个字符的 ...

  8. Java实现 蓝桥杯 算法提高 矩阵相乘

    算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也 ...

  9. Java实现 蓝桥杯VIP 算法提高 质数的后代

    算法提高 质数的后代 时间限制:1.0s 内存限制:256.0MB 问题描述 在上一季里,曾提到过质数的孤独,其实从另一个角度看,无情隔膜它们的合数全是质数的后代,因为合数可以由质数相乘结合而得. 如 ...

  10. Java实现 蓝桥杯VIP 算法提高 任意年月日历输出

    算法提高 任意年月日历输出 时间限制:1.0s 内存限制:512.0MB 已知2007年1月1日为星期一. 设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印. 为 ...