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

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

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

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

1、第一点给堆设置参数

-Xms5m -Xmx20m

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

配置参数:

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

  1. package com.bjsxt.base001;
  2.  
  3. public class Test01 {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. //-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
  8.  
  9. //查看GC信息
  10. System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
  11. System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
  12. System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
  13.  
  14. byte[] b1 = new byte[1*1024*1024];
  15. System.out.println("分配了1M");
  16. System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
  17. System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
  18. System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
  19.  
  20. byte[] b2 = new byte[4*1024*1024];
  21. System.out.println("分配了4M");
  22. System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
  23. System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
  24. System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
  25.  
  26. }
  27.  
  28. }

-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空间

我们来看下面的列子:

  1. package com.bjsxt.base001;
  2.  
  3. public class Test02 {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. //第一次配置
  8. //-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
  9.  
  10. //第二次配置
  11. //-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
  12.  
  13. //第三次配置
  14. //-XX:NewRatio=老年代/新生代
  15. //-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
  16.  
  17. byte[] b = null;
  18. //连续向系统申请10MB空间
  19. for(int i = 0 ; i <10; i ++){
  20. b = new byte[1*1024*1024];
  21. }
  22. }
  23. }

程序运行的效果是:

[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

  1. package com.bjsxt.base001;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class Test03 {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. //-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump
  10. //堆内存溢出
  11. Vector v = new Vector();
  12. for(int i=0; i < 5; i ++){
  13. v.add(new Byte[1*1024*1024]);
  14. }
  15.  
  16. }
  17. }

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

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

  1. package com.bjsxt.base001;
  2.  
  3. public class Test04 {
  4.  
  5. //-Xss1m
  6. //-Xss5m
  7.  
  8. //栈调用深度
  9. private static int count;
  10.  
  11. public static void recursion(){
  12. count++;
  13. recursion();
  14. }
  15. public static void main(String[] args){
  16. try {
  17. recursion();
  18. } catch (Throwable t) {
  19. System.out.println("调用最大深入:" + count);
  20. t.printStackTrace();
  21. }
  22. }
  23. }

运行结果:

调用最大深入: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. 01 . Tomcat简介及部署

    Tomcat简介 Tomcat背景 tomcat就是常用的的中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中.而tomcat本 ...

  2. Codeforces Round #646 (Div. 2)【C. Game On Leaves 题解】

    题意分析 关于这道题,意思就是两个人摘叶子,谁最后摘到编号为x的谁就赢了.既然是叶子,说明其最多只有一个分支,由于题目上说了是无向图,那就是度数小于等于的节点.也就是一步步移除度数小于等于的节点,直到 ...

  3. AUTOSAR-标准文档索引

    https://mp.weixin.qq.com/s/6yl5dBP1mSFGVsfE7YRm6w   索引的两种方法: 关键字检索:用Document Search搜索下载,https://www. ...

  4. 使用setTimeout()代替setInterval()

    背景: 在JavaScript中,有两种定时器:setTimeout()和setInterval():setTimeout()只执行一次定时操作,setInterval()执行无限次定时操作:但是大多 ...

  5. ActiveMQ 笔记(一)概述与安装

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.消息中间件的产生背景 1.前言:考虑消息中间件的使用场景? 在何种场景下需要使用消息中间件 为什么要 ...

  6. 【RT-Thread笔记】BH1750软件包的使用

    BH1750简介 BH1750是一种用于两线制串行总线接口的16位数字型光强度传感器集成电路.利用它的高分辨率可以探测较大范围的光强度变化.(1lx~65535lx). 创建工程.验证 在RT-Thr ...

  7. Java实现 蓝桥杯 算法提高 日期计算

    算法提高 日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情 ...

  8. Java实现 蓝桥杯VIP 算法训练 水仙花数

    这道题有两个方法,第一个就相对来说通俗易懂 第二个可以用到Java的一些方法 public class 水仙花数1 { public static void main(String[] args) { ...

  9. Java实现 LeetCode 392 判断子序列

    392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符 ...

  10. Java实现 LeetCode 86 分割链表

    86. 分隔链表 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1 ...