代码编织梦想

三种JVM:

  • Sun公司 HotSpot
  • BEA公司 JRockit
  • IBM J9VM

:Heap
一个JVM只有一个堆内存,堆内存的大小是可以调节的。

类加载器读取了类文件后,一般会把类的具体实例、方法、常量、变量放在堆中,保存我们所有引用类型的真实对象;

堆内存中还要细分为三个区域:

  • 新生区(伊甸园区) Young/New
  • 养老区 Old
  • 永久区 Perm

在这里插入图片描述

GC垃圾回收主要在伊甸园区和养老区
堆内存满了会报出OOM(OutOfMemoryError:java heap space)错误,堆内存不够。


在JDK8以后,永久存储区改了名字 叫元空间

新生区、老年区:

  • 类:诞生和成长的地方,甚至死亡
  • 伊甸园区,所有的对象都是在伊甸园区new出来的。当伊甸园区装满就会进行一次轻GC。假设该对象在GC垃圾回收中能存活下来一次 就进入幸存者区
  • 幸存者区(from,to):当幸存者区装满 就会触发重GC 存活下来的进入养老区。幸存者区是动态的,from,to区域会互换

    经过研究,99%的对象都是临时对象,不会走到养老区。

永久区:
该区域常驻内存。用来存放一些JDK自身携带的Class对象、Interface元数据。存储的是Java运行时的一些环境。这个区域不存在垃圾回收。关闭虚拟机的时候就会释放永久区的内存。

一个启动类加载了大量的第三方jar包,或者tomcat部署了太多的应用,或者大量的动态生成的反射类。就会导致永久区内存被装满,就会产生OOM。

方法区存在于永久区内(也叫非堆(只是个名词,其实也是堆))

  • JDK1.6之前:永久代,常量池是在方法区
  • JDK1.7:永久代,但是慢慢退化了(去永久代),常量池在堆中
  • JDK1.8之后:无永久代,常量池在元空间

在这里插入图片描述

元空间逻辑上存在,但物理上可能并不存在,下方用代码验证

可以通过一些代码看是否会丢内存:

//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory(); //字节1024*1024
//返回JVM的总内存
long total = Runtime.getRuntime().totalMemory();

System.out.println("max="+max+"字节"+(max/(double)1024/1024)+"MB");
System.out.println("total="+total+"字节"+(max/(double)1024/1024)+"MB");

默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存大约是电脑内存的1/64

在虚拟机选项上添加指令 -XX:+PrintGCDetails,就可以看到堆内存分配情况,也可以-Xms(内存大小) -Xms(内存大小)来调节堆内存空间。

在这里插入图片描述
在此处打开运行编辑设置
在这里插入图片描述
当出现OOM错误时,先尝试扩大堆内存看是否还会报错,如果仍然报错,就可以看一下堆内存分配结果寻找问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_44976835/article/details/111084999

闲来无事分享ThreadLocal-爱代码爱编程

一. 先来了解几个概念 什么是ThreadLocal ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 *ThreadLocal源码解析 如图主要的几个方法,下面逐一分析:

Java虚拟机-爱代码爱编程

1. JVM 的主要组成部分及其作用? JVM是Java Virtual Machine(Java虚拟机),在我们运行本地编写的Java程序后,编译器将Java文件编译成Java .class文件,然后将.class文件输入JVM, JVM加载并执行类文件。下面是JVM的架构图, JVM包含两个子系统和两个组件,两个子系统为Class load

Synchronized和Lock的区别-爱代码爱编程

Synchronized和Lock的区别 synchronized是Java内置对象,在JVM层面,Lock是个Java类;synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;synchronized会自动释放锁(a线程执行完同步代码会释放锁;b线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlo

JAVA虚拟机相关总结-爱代码爱编程

JAVA虚拟机相关总结 基础知识 详细总结见博文 1. Java 内存区域 Java运行时内存区域分为: 程序计数器(PCR):记录各线程正在执行的虚拟机指令地址。虚拟机栈:线程私有,随线程创建,用栈帧(Frame)的方式储存局部变量表、操作数栈、动态链接方法出口等信息。方法从调用到完成,对应栈帧的入栈和出栈。其中局部变量表包括基本数据类型和引用

7-4 jmu-Java-06异常-01-常见异常 (20分)-爱代码爱编程

7-4 jmu-Java-06异常-01-常见异常 (20分) 自己编码以产生常见异常。 ###main方法: 事先定义好一个大小为5的数组。 根据屏幕输入产生相应异常 提示:可以使用System.out.println(e)打印异常对象的信息,其中e为捕获到的异常对象。 **输入说明: ** arr 代表产生访问数组是产生的异常。然后输入下

7-5 jmu-Java-06异常-02-使用异常机制处理异常输入 (20分)-爱代码爱编程

7-5 jmu-Java-06异常-02-使用异常机制处理异常输入 (20分) 使用异常处理输入机制,让程序变得更健壮。 ###main方法: 输入n,创建大小为n的int数组。 输入n个整数,放入数组。输入时,有可能输入的是非整型字符串,这时候需要输出异常信息,然后重新输入。 使用Arrays.toString输出数组中的内容。 输入样例: 5