首页 > 系统相关 >JVM(四)-- JVM内存模型

JVM(四)-- JVM内存模型

时间:2022-12-08 17:59:50浏览次数:56  
标签:-- public method static 内存 JVM class

整体描述

前面对运行时数据区描述了很多,其实重点存储数据的是堆和方法区(非堆),所以内存的设计也着重从

这两方面展开(注意这两块区域都是线程共享的)。对于虚拟机栈,本地方法栈,程序计数器都是线程私有的。

(1)一块是非堆区,一块是堆区
(2)堆区分为两大块:一个是Old区,一个是Young区
(3)Young区分为两大块:一个是Survivor区(S0+S1),一块是Eden区
(4)S0和S1一样大,也可以叫From和To

Java Memory Model (JMM待完善)

官网:https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4

对象在内存中的分配回收

代码示例

-Xmx50M -Xms50M

堆的OOM
@RestController
public class HeapController {
    List<Worker list=new ArrayList<Worker();
    @GetMapping("/heap")
    public String heap() throws Exception{
        while(true){
            list.add(new Worker());
        }
    }
}

运行结果:

方法区的OOM

-XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=50M

(1)asm依赖

<dependency   
    <groupIdasm</groupId   
    <artifactIdasm</artifactId  
    <version3.3.1</version
</dependency

(2)工具类

public class MetaspaceUtil extends ClassLoader {

    public static List<Class<? createClasses() {
        List<Class<? classes = new ArrayList<Class<?();
        for (int i = 0; i < 10000000; ++i) {
            ClassWriter cw = new ClassWriter(0);
            cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
                    "java/lang/Object", null);
            MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init",
                    "()V", null, null);
            mw.visitVarInsn(Opcodes.ALOAD, 0);
            mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
                    "<init", "()V");
            mw.visitInsn(Opcodes.RETURN);
            mw.visitMaxs(1, 1);
            mw.visitEnd();
            MetaspaceUtil test = new MetaspaceUtil();
            byte[] code = cw.toByteArray();
            Class<? exampleClass = test.defineClass("Class" + i, code, 0, code.length);
            classes.add(exampleClass);
        }
        return classes;
    }
}

(3)代码

@RestController
public class NonHeapController {

    List<Class<? list=new ArrayList<Class<?();
    @GetMapping("/nonheap")
    public String heap(){
        while(true){
            list.addAll(MetaspaceUtil.createClasses());
        }
    }
}

运行结果:

栈溢出
public class StackOverFlowDemo {

    public static long count=0;

    public static void method(){
        System.out.println(count++);
        method();
    }

    public static void main(String[] args) {
        method();
    }
}

运行结果:

标签:--,public,method,static,内存,JVM,class
From: https://www.cnblogs.com/snail-gao/p/16966812.html

相关文章

  • Go--解析yaml文件
    yaml文件是目前最常用的配置文件,使用go语言编写代码和工具时,也会用到yaml文件,将服务配置及中间件等信息定义到yaml文件中,后续可根据实际场景来选用。//先下载外部包go......
  • django三板斧
    今日内容概要纯手撸web框架基于wsgiref模块代码封装优化动静态网页jinja2模板语法python主流web框架django框架简介django基本操作命令django小白必会三板斧今......
  • 数据安全新战场,EasyMR为企业筑起“安全防线”
    2020年1月,时间跨度长达14年的,微软2.5亿条客户服务和支持记录在网上泄露;同年4月,微盟发生史上最贵“删库跑路”事件,造成微盟市值一夜之间缩水约24亿港币;今年7月,网信办依据......
  • 破产姐妹
    S1-6季高清双语视频链接:https://pan.baidu.com/s/1Hv25_iNEaplodBs4pTmlmw提取码:boxp1-6季原声音频&中英文台词剧本https://pan.baidu.com/s/1BW_d46Zy7vVIKqi7s2wKIw......
  • 腾讯云服务器迁移云硬盘
     使用场景:将同个地区的云服务器A上的硬盘挂在到挂载到云服务器B上(必须是同一服务地区)第一步:进入云服务A控制台用shell命令:umount+ 硬盘例如云服务器A上的硬盘目录......
  • Linux centos7升级内核
    1、查看当前内核版本 2、 CentOS允许使用ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。1.导入该源的秘钥rpm--importhttps://www.elrepo.org/RPM-GPG-KE......
  • 前端笔记_3_页面变灰
    html{-moz-filter:grayscale(100%);-ms-filter:grayscale(100%);-o-filter:grayscale(100%);-webkit-filter:grayscale(1);-webkit-filter:......
  • 用python计算圆周率PI
    描述用python计算圆周率PI要求能算到小数点后面越多越好(5分)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪......
  • 卡尔曼滤波之基本概念和状态观测器
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • Python7段数码管绘制
    #七段数码管绘制importturtleastimporttimeasTdefdrawGap():#绘制数码管的间隔t.penup()t.fd(5)defdrawLine(draw):#绘制单段数码管,draw为True时,则实......