1、Java 7和Java 8区别
Java 7堆结构
JDK 1.8之后将最初的永久代取消了,由元空间取代。
在Java8中,永久代已经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。
元空间与永久代之间最大的区别在于: 永久带使用的JVM的堆内存,但是java8以后的元空间并不在虚拟机中而是使用本机物理内存。 因此,默认情况下,元空间的大小仅受本地内存限制。
类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由MaxPermSize 控制, 而由系统的实际可用空间来控制。
2、堆内存
public static void main(String[] args){ long maxMemory = Runtime.getRuntime().maxMemory() ;//返回 Java 虚拟机试图使用的最大内存量。 long totalMemory = Runtime.getRuntime().totalMemory() ;//返回 Java 虚拟机中的内存总量。 System.out.println("MAX_MEMORY = " + maxMemory + "(字节)、" + (maxMemory / (double)1024 / 1024) + "MB"); System.out.println("TOTAL_MEMORY = " + totalMemory + "(字节)、" + (totalMemory / (double)1024 / 1024) + "MB"); }
发现默认的情况下分配的内存是总内存的“1 / 4”、而初始化的内存为“1 / 64”
VM参数: -xms1024m -Xmx1024m -XX:+PrintGCDetails
Java7
Java 8
3、堆内存溢出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
package com.yanshu; import java.util.Random; /** * @author :yangyuanyuan * @description:Todo * @date :2021/1/27 10:22 */ public class test4 { public static void main(String[] args) { String str = "hello world" ; while(true) { str += str + new Random().nextInt(88888888) + new Random().nextInt(999999999) ; // System.out.println(str+"\t"); } } }
VM参数:-xms8m -Xmx8m -XX:+PrintGCDetails
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。