导图社区 Linux
关于Linux的思维导图,如Java 虚拟机是如何判定两个 Java 类是相同的?Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
这份年度读书计划(程序员版)思维导图,为程序员们精心规划了一条系统且全面的学习路径。列出了技术书籍与生活技能书籍的规划,涵盖从Java技术深化到健康管理、兴趣拓展等。
关于Spring知识点,详细!面试必备的思维导图,如什么是织入?什么是织入应用的不同点?织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程,织入可以在编译时,加载时,或运行时完成。
社区模板帮助中心,点此进入>>
互联网9大思维
安全教育的重要性
组织架构-单商户商城webAPP 思维导图。
个人日常活动安排思维导图
域控上线
西游记主要人物性格分析
17种头脑风暴法
python思维导图
css
CSS
Linux
软件安装
centos 安装 docker命令
1.demo
1.curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 或者curl -sSL https://get.daocloud.io/docker | sh 2. sudo systemctl start docker 3. yum list docker-ce --showduplicates | sort -r 4.sudo yum install docker-ce.x86_64 docker-ce-cli.x86_64 containerd.io 5.sudo docker run hello-world 查看docker版本 docker -v 卸载docker yum remove docker-ce 运行程序 docker run ubuntu:15.10 /bin/echo "Hello world" 命令解释 Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果
运行交互式的容器
创建的一个ubuntu镜像 然后在里面创建一个伪终端 docker run -i -t ubuntu:15.10 /bin/bash exit 命令退出该模式
启动容器(后台模式)
创建一个以进程方式运行的容器 docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看docker运行实例
docker ps 输出详情介绍: CONTAINER ID: 容器 ID。 IMAGE: 使用的镜像。 COMMAND: 启动容器时运行的命令。 CREATED: 容器的创建时间。 STATUS: 容器状态。 状态有7种: created(已创建) restarting(重启中) running 或 Up(运行中) removing(迁移中) paused(暂停) exited(停止) dead(死亡) PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。 NAMES: 自动分配的容器名称。使用 docker logs 容器 ID 命令,查看容器内的标准输出 docker logs 自动分配的容器名称 也可以看到
停止容器命令
docker stop 容器 ID
Linux命令总结
主题
JVM
内存溢出问题
原因
内存中加载的数据量过于庞大,如一次性从数据库取出大量数据
集合类中有对对象的引用,使用完没有清空 使得JVM不能回收
代码中存在死循环 或者死循环中存在大量的重复实体
启动参数内存值设置的小
第三方软件的Bug
解决方案
1.修改JVM启动参数,直接增加内存,
2.检查错误日志,查看 out of memory 之前是否有其他的异常错误
3.对代码进行检查和分析找出可能发生内存溢出的位置
虚拟机重要组成部分
程序计数器
当前线程所执行的字节码的行号指示器
虚拟机栈
每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧[插图](Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
栈溢出的原因:1.不断递归方法调用,栈针过大 2.栈针过多 stackoverflow
本地方法栈
虚拟机使用到的本地(Native)方法服务
堆
被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例
组成部分
新生代
伊甸园区
幸存者1区
幸存者2区
老年代
永久代 JDK1.8 修改为MetaSpace
方法区
各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存
堆内存诊断工具命令
jps
jstack
jstack 进程id (16进制的) 可以找到代码行数
jmap jmap -heap 进程id 查看堆内存占用
jconsole 内存使用工具
jvisualvm:可视化内存监控工具 可以排查到具体的类的属性 根据它可以定位代码中的不合理的地方
类加载器
名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中
类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象
实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。
Java 虚拟机是如何判定两个 Java 类是相同的
Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。
即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件 Sample.class。两个不同的类加载器 ClassLoaderA和 ClassLoaderB分别读取了这个 Sample.class文件,并定义出两个 java.lang.Class类的实例来表示这个类。这两个实例是不相同的。
对于 Java 虚拟机来说,它们是不同的类。试图对这两个类的对象进行相互赋值,会抛出运行时异常 ClassCastException