参考:

内存模型:https://blog.csdn.net/qq_34280276/article/details/52783096

类加载原理:https://nomico271.github.io/2017/07/07/JVM%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6/

垃圾回收机制:http://www.importnew.com/26821.htmlhttps://blog.51cto.com/chenhai/1051926

垃圾回收机制:

虚拟机调优:

一、JVM内存模型

堆内存:保存所有引用数据类型的真实信息

方法区:属于共享区域,所有的方法信息都定义在该区

栈内存:基本类型、运算、指向推内存的指针,与线程拥有相同的生命周期

程序计数器:是一个非常小的内存空间,用于指向下一个要执行的代码

本地方法栈:调用本地方法的接口

二、类加载原理

JVM类加载过程分为:加载、验证、准备、解析、初始化、使用、卸载

加载:将.class 文件中的二进制字节流读入到JVM,完整的步骤包括

1.通过类的全限定名获取类的二进制字节流

2.将字节流代表的静态存储结构转化为方法区的运行时数据结构

3.在内存中生成一个改类的 Class 对象

验证:主要确保加载进来的字节流符合JVM规范。

1.文件格式验证

2.元数据验证

3.字节码验证

4.符号引用验证

准备: 静态变量在方法区分配内存,并设置默认初始值

解析:虚拟机将常量池内的符号引用替换为直接引用的过程

初始化:初始化是类加载的最后一步,主要根据程序中的赋值语句为类变量赋值

1.先初始化父类,再初始化子类

初始化条件:

1.使用new

2.设置类静态字段

3.调用静态方法

4.使用反射,对类反射调用

类加载器:

类加载器:

启动类加载器:Bootstrap ClassLoader 负责加载Java_HOME/lib ,或者通过-Xbootclasspath 指定路径,且被认可的类

扩展类加载器:Extension ClassLoader :加载JAVA_HOME\LIB\ext 目录中,或者通过java.ext.dirs 系统变量指定路径的类库

应用程序类加载器:Application ClassLoader:也称作系统类加载器,负责加载用户路径 classpath 上的类库

自定义类加载器:

类加载器之间的模型叫做:双亲委派模式

该模型,除了顶层的类加载外,其余的类加载器都应该有自己的父类加载器,父子关系通过组合实现。

双亲委派工作过程:

如果一个类接收加载请求,自己不会加载这个请求,而是将这个类加载请求委派给父类加载器,直到顶层,当父类无法加载时,子类才会尝试加载

三、JVM 垃圾回收机制

垃圾回收机制:GC,垃圾收集机制指将那些不再使用的对象占用的空间释放。

GC 原理:

Java 内存的管理实际上是对对象的管理,包括对象的分配与释放。

如何确定一个对象是否可以被回收?

常用的算法:引用计数算法、可达性分析算法

引用计数算法的缺点明显,一般都采用的是可达性分析

判断是否可达的GC root:

1.虚拟机栈中引用的对象

2.方法区中静态属性引用的对象

3.方法区中常量引用的对象

4.本地方法栈中引用的对象

当确定了可以回收的对象后,如何对对象回收?

1.标记-清除

  标记需要清除的对象,清除带有标记的对象,容易造成内存碎片化

2.标记-整理

  是标记-清除的高级版,删除标记的对象,对剩余的对象进行整理,不会产生碎片

3.复制

  将内存分为2快,再一块满后将活在的对象复制到另一半,清除前面的一般内存。造成内存可用缩小一半

4.分代收集算法

  将内存分为新生代、老年代,对不同的区域使用不用的算法

  新生带存活的对象较多,采用复制算法

  老年代存活对象较少,使用标记-清理 or 标记 -整理

四、JVM  内存调优

深入理解Jvm 虚拟机的更多相关文章

  1. 《深入理解JVM虚拟机》读书笔记

    前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...

  2. 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图

    进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 之前一直都是零零散散的看了些JVM的知识,心想这样不行啊!于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更 ...

  3. Java工程师学习指南第6部分:深入理解JVM虚拟机

    本文整理了微信公众号[Java技术江湖]发表和转载过的JVM虚拟机相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. JVM原理分析,看了都说好 JVM 深入学习:Java 解析 Cl ...

  4. 深入理解JVM虚拟机11:Java内存异常原理与实践

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  5. 深入理解JVM虚拟机1:JVM内存的结构与消失的永久代

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  6. 深入理解JVM虚拟机:(一)Java运行时数据区域

    概述 JVM是Java语言的精髓所在,因为它Java语言实现了跨平台运行,以及自动内存管理机制等,本文将从概念上介绍JVM内存的各个区域,说明个区域的作用. JVM运行时数据区模型 Java虚拟机在执 ...

  7. 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

    微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...

  8. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

    欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我博客 也欢迎关注公 众 号[Ccww笔记],原创技术文章 ...

  9. 深入理解JVM虚拟机(一):JVM运行时数据区

    概述: JVM将内存的管理进行封装,使得开发人员不必关心内存申请.释放操作.但是在高级程序开发.复杂业务场景开发的时候,如果出现内存溢出的情况,对于开发人员而言就很难去分析出原因.所以还是很有必要去了 ...

  10. 深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    打破双亲委派模型 JNDI JNDI 的理解   JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一 ...

随机推荐

  1. (26)基于cookie的登陆认证(写入cookie、删除cookie、登陆后所有域下的网页都可访问、登陆成功跳转至用户开始访问的页面、使用装饰器完成所有页面的登陆认证)

    获取cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age ...

  2. 接口测试基础——第3篇smtplib发送带图片的邮件

    smtplib发送邮件最后一篇,发送带图片的邮件: 大家可以去廖雪峰的网站看一下,下面的代码就是我跟着博客写的,哈哈,大家即使不明白为什么,也要多写两遍,记在心里,如果有不明白的地方可以留言,船长会第 ...

  3. Java图片验证码学习

  4. Linux内核分析第九次作业

    理解进程调度时机跟踪分析进程调度与进程切换的过程 一.基础知识 Linux系统的一般执行过程 一般情况:正在运行的用户态进程X切换到运行用户态进程Y的过程 1. 正在运行的用户态进程X 2. 发生中断 ...

  5. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

  6. ROS下利用realsense采集RGBD图像合成点云

    摘要:在ROS kinetic下,利用realsense D435深度相机采集校准的RGBD图片,合成点云,在rviz中查看点云,最后保存成pcd文件. 一. 各种bug 代码编译成功后,打开rviz ...

  7. jekins构建触发器详解

    jenkins版本:2.89.2 1.触发远程构建 (例如,使用脚本):通过一个网址的访问来触发构建,这样就不需要登录jenkins系统也能触发构建了. 示例地址: http://localhost: ...

  8. mysql 将行拼接成字符串的方法

    见代码: ;//保证可以拼接足够长的字符串,没它 数据量大时会截断结果1 group by videoType 效果如下:

  9. Lock和synchronized的区别和使用

    Java并发编程:Lock 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问 ...

  10. 查看docker容器的内存占用

    使用docker stats命令可以查看容器的内存,但是有时候docker stats命令获得的数据可能准确,可以参考下面这种方式 先通过docker ps -a 找到容器的container id ...