首页 > 其他分享 >JVM

JVM

时间:2022-12-24 23:25:19浏览次数:55  
标签:com JProfilerDemo04 内存 JVM new 方法 public

  • 单点登录
  • 方法区 类模板 常量池
  • JavaGuide
  • 调堆内存 VM options
  • JProfiler工具
  • 引用计数法
  • JMM定义了一套在多线程读写共享数据(变量、数组)时,对数据的可见性、有序性和原子性的规则和保障。

JVM的体系结构

JVM体系结构

类加载器和双亲委派机制

类加载器和双亲委派机制

native和方法区

package com.JVMThreshold;
//native和方法区
public class NativeDemo01 {
    public static void main(String[] args) {
        new Thread(() -> { }).start();
    }
    /*
    native :凡是带了native 关键字的,说明java的作用范围达不到了,回去调用底层c语言的库!
    会进入本地方法栈
    调用本地方法本地接口JNI
    JNI作用:扩展Java的使用,融合不同的编程语言为ava所用!最初: C、C++。
    Java诞生的时候c、C++横行,想要立足,必须要有调用c、C++的程序
    它在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native 方法
    在最终执行的时候,加载本地方法库中的方法通过JNI

    Java程序驱动打印机,管理系统,掌握即可,在企业级应用中较为少见!
     */
    public native void start0();
    //调用其他接口:socket..webservice~..http~
    //球球爱心网: -->输入(PHP) --> NodeJS -->Socket -->C++-->游戏刷爱心

    /* 方法区
    Method Area方法区
    方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,
    简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间;

    ***静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中***
    但是实例变量存在堆内存中,和方法区无关。
     */
}

新生区、养老区、永久区、堆内存调优

package com.JVMThreshold;
//新生区、养老区、永久区、堆内存调优
public class Test02 {
    public static void main(String[] args) {
        //返回虚拟机试图使用的最大内存
        long max = Runtime.getRuntime().maxMemory();
        //返回jvm的初始化总内存
        long total = Runtime.getRuntime().totalMemory();
        System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
        System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB");
        //默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存: 1/64

        //遇到 OOM 问题:
        //1.尝试扩大堆内存
        //2.分析内存,看一下那个地方出现了问题(专业工具)
        // -Xms1024m -Xmx1024m -XX:+PrintGCDetails

        //元空间逻辑上存在 物理上不存在
    }
}

堆内存调优

package com.JVMThreshold;
//堆内存调优
// -Xms1024m -Xmx1024m -XX:+PrintGCDetails
import java.util.Random;
public class Test03 {
    public static void main(String[] args) {
        String str = "asdasdasdasdas";
        while(true){
            str += str + new Random().nextInt(8_8888_8888)
                    + new Random().nextInt(9_9999_9999);
        }
    }
}

使用JProfiler工具分析OOM原因

package com.JVMThreshold;
//使用JProfiler工具分析OOM原因
/*
-Xms 设置初始化内存分配大小 默认是1/164
-Xmx 设置最大分配内存 默认是1/4
-XX:+PrintGCDetails  打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError

-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
 */
import java.util.ArrayList;
public class JProfilerDemo04 {
    byte[] array = new byte[1024*1024];

    public static void main(String[] args) {
        ArrayList<JProfilerDemo04> list = new ArrayList<>();
        int count = 0;
        try{
            while(true){
                list.add(new JProfilerDemo04());
                count++;
            }
        }catch(Error e){
            System.out.println(count);
            e.printStackTrace();
            /*
            1676
            java.lang.OutOfMemoryError: Java heap space
           at com.JVMThreshold.JProfilerDemo04.<init>(JProfilerDemo04.java:6)
           at com.JVMThreshold.JProfilerDemo04.main(JProfilerDemo04.java:13)
             */
        }

    }
}

标签:com,JProfilerDemo04,内存,JVM,new,方法,public
From: https://www.cnblogs.com/799rijiyuelei/p/17003528.html

相关文章

  • 如何啃下JVM这座大山,完结撒花!
    JVM往期系列:【JVM系列1】JVM内存结构【JVM系列2】运行时数据区域【JVM系列3】类的加载【JVM系列4】JVM常用命令【JVM系列5】性能检测工具【JVM系列6】垃圾收集器......
  • 【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务
    前提介绍相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使用......
  • 线上JVM内存分析
    centos7环境1、查看占用内存前10的进程ps-aux|sort-k4nr|head-10  2、根据进程号查看jvm内存占用情况jmap-head57627期间遇到问题:Supportedvers......
  • 【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务
    前提介绍相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使......
  • JVM调优思路
    思路相关文章:​​JVM常用调优参数​​总结JVM调优不是一蹴而就:Step1.根据各种命令或监控软件,去收集现象Step2.根据现象去推理原因Step3.根据原因去修改JVM参数然后再重启......
  • JVM调优思路
    思路相关文章:JVM常用调优参数总结JVM调优不是一蹴而就:Step1.根据各种命令或监控软件,去收集现象Step2.根据现象去推理原因Step3.根据原因去修改JVM参数然后......
  • JVM常用调优参数
    目录JVM内存模型及常用参数参数解释垃圾收集器Serial收集器(-XX:+UseSerialGC-XX:+UseSerialOldGC)ParallelScavenge收集器(-XX:+UseParallelGC-XX:+UseParallelOldGC)P......
  • 内存溢出分析工具MAT实战(一)JVM启动参数分析
    在工作的过程中,有时我们会遇到内存溢出的问题,这时候就需要我们有足够的知识积累去解决内存溢出相关问题。本文章是建立在读者了解java的内存结构的基础上。关于内存分析工具......
  • jvm内存划分
    首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执......
  • Java 特性、三大版本、JDK、JRE、JVM
    Java的特性 简单性面向对象可移植性writeonce,runanywhere高性能分布式动态性通过反射机制多线程安全性异常机制健壮性 *思考?j......