
JMM
文章平均质量分 75
第二颗大白菜
每天写点什么,不是为了得到一些什么,也不是向谁证明一些什么,更不是为了存在感,而是让自己知道每天都做了些什么。
展开
-
刚new出来的对象实例,内部的属性对象实例是如何在内存中访问的?
刚new出来的对象实例,内部的属性对象实例是如何在内存中访问的?1.先贴个代码(1)我们定义了两个类:一个 Book书、一个Bookmark书签@Datapublic static class Book { private int id; private String name; private Bookmark bookmark; public Book(int id, String name, Bookmark bookmark) {...原创 2021-02-17 22:28:26 · 413 阅读 · 0 评论 -
一个对象的实例中到底有什么信息?
一个对象的实例中到底有什么信息?记得上回我在说堆内存的时候,说到,堆内存中存放的都是对象的实例数据,一个个的实例。然后再后来的对象实例的创建中,我们也提到了对象实例的创建过程,也提到了对象实例。那么问题来了,对象实例到底有哪些数据组成,为什么这么多实例对象呢?我们带着这个问题去分析一下对象的实例中的内存布局情况。1.话不多说,先上一张模型图。大家可以先看看,我们带着这张图进行分析,可以现在看不懂,但是在我们分析后,就需要看懂了。2.图片上很明显...原创 2021-02-17 17:37:03 · 807 阅读 · 0 评论 -
一个新生命诞生的过程(Java对象的创建)
一个新生命诞生的过程(Java对象的创建)这个标题取得有点哲学意思哈。Java中频繁的创建对象,是我们家常便饭,那么对于我们的家常便饭,他如何被创建出来的呢?他制作的过程中,分为哪些主要的步骤呢?制作的过程又涉及到哪些我们所了解的内存区域呢?Java虚拟机是怎么帮我们制作出这些对象的?问题很多,有这么多的疑问,我们都想去学习其中的所以然。那么我们就带着这些疑问去了解一下整个对象的创建过程。关于创建对象,我们都是 new Object(),方式,但是笔者也见过通过深拷贝、序列化等方..原创 2021-02-15 17:17:02 · 275 阅读 · 0 评论 -
直接内存(个人认为是本地直接内存,而不是堆外内存)
直接内存(个人认为是本地直接内存,而不是堆外内存)那么直接内存到底是什么呢?直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。这是百科关于直接内存访问的概述。那么关于直接内存的概述呢?直接内存是一种加快IO传递的解决方案,个人认为,我们的虚拟机要想将磁盘上的一个文件通过网络传输socket等方式,发送给其他设备,那么就会在多个内存区域之间拷贝多次,才能实现发送这个动作.原创 2021-02-15 10:30:21 · 2112 阅读 · 2 评论 -
非堆,方法区(常量池的生成机制)
非堆,方法区一个不是堆内存的区域,这样理解吗?其实笔者刚开始也是这样理解的,但是当我们了解了其中的原理,就不会这样认为了,也不能这样认为了。“非堆”、“堆”不能将其认为是两个相对的内存区域,甚至我们可以将其统称为堆。在Java虚拟机规范中描述:方法区为堆的一个逻辑部分。但是我们在内存模型构建的时候,就是将堆和方法区分为块区域的。那么它们分别有什么共同点呢?方法区又存放的是什么数据内容呢?共同点:有堆内存的特性,线程共享;那么线程共享,自然而言,里面存放的数据...原创 2021-02-14 13:44:18 · 686 阅读 · 0 评论 -
堆内存,最大的内存区域
堆内存,最大的内存区域如题,我觉得这样说一点都不为过。给大家看一张生产环境的堆内存和非堆内存的监控图片。大家观察下图中Heap Usage 设置的 最大内存,已经超过4GB,那么我们对比一下右边的non-Heap Usage,也就是300MB。可想而知,我们对于堆内存是多么的慷慨。那么堆内存到底存放的是什么数据呢?在运行时数据区域,很多说法都直接将其划分为 堆内存区域和非堆内存区域,也就是说,一个内存占用,要么是在堆内存中,要么就是在非堆内存中。可想而知,堆这个概念...原创 2021-02-13 22:19:14 · 914 阅读 · 0 评论 -
一个与Java虚拟机栈没什么区别的内存区域-本地方法栈
一个与Java虚拟机栈没什么区别的内存区域-本地方法栈本质来说,就是一个栈空间,也有类似的栈帧,局部变量表,也会存储很多数据结构类型。他的实现不是通过Java的字节码文件编译而来,所以说,在一开始,这里的内存空间基本是确定,且基本上不怎么会出现内存溢出问题,因为,都是官方封装好的源代码,底层都是直接通过C实现的,都不是面向Java开发人员的一块内存区域,那么自然而言,就没有了太复杂的应用,也就不会太容易出现问题。所服务的对象也就是本地方法。在结构上的区别而言,基本上和Java虚拟机.原创 2021-02-13 17:43:02 · 296 阅读 · 0 评论 -
Java虚拟机栈???????
Java虚拟机栈???????“线程私有”内存空间;Java虚拟机栈空间是存放Java方法执行的线程内存模型;我们需要分享Java虚拟机机栈空间里面的时候,需要贴上一张详细的图片来表示:就是下图中所圈出的那块区域,结构很清晰,每个线程都会有一个栈空间,栈空间中存放了很多栈帧,那么这些栈帧中到底存放了些什么数据呢?我们知道,在每个Java方法被执行的时候,Java虚拟机就会同时创建一个栈帧,那么多个方法,就会有多个栈帧;那么每个方法中都会对应到一个栈帧;然后我们思考一下,...原创 2021-02-13 17:33:01 · 237 阅读 · 0 评论 -
什么叫做“程序计数器”?它能做什么?
什么叫做“程序计数器”?它能做什么?程序计数器在JMM中的位置如下是一个线程独享的数据区域,也就是说,每个线程之间的数据相互不干扰,是一个线程内存空间。程序计数器 内存空间是不大的,第一眼看到这个名词,很有可能被认为是计量程序执行次数?不不不,千万别这样理解,我们可以把它当做一个下标位置临时存储,例如打断点中的当前断点位置;都知道,对于jvm层面而言,所执行的是class字节码文件,那么字节码文件中的程序逻辑也有顺序,一个简单的程序化结构语言如下:那么程序计数器中到底存...原创 2021-02-13 12:16:42 · 7639 阅读 · 2 评论 -
JVM的内存结构,简单说一下为什么要知道JMM(开篇)
JVM的内存结构,简单说一下JMM我们为什么要学习jmm呢?这其实是一种追本溯源的过程,对于开发人员来说,需要很清晰的控制每个对象的出生到毁灭,并且需要控制每一个对象的归属,而不是随波逐流。这尤其是C的开发人员。但是对于Java程序员来说,在虚拟机自动内存管理机制的帮助下。我们放宽了很多心,我们类似将整个项目的对象的构造,回收都托管给了第三方,也就是Java虚拟机内存管理模型。如此一来,我们就不需要花重心去打理内存的使用,但是Jvm虚拟机内存模型并不是永远不会发生错误,也会有内存溢出的情况,那.原创 2021-02-13 10:56:35 · 472 阅读 · 0 评论 -
使用白话文,实例化举例来讲一讲,垃圾回收模型,到底是什么意思,什么叫串行、什么叫并行、什么又叫并发呢?
使用白话文,实例化举例来讲一讲,垃圾回收模型,到底是什么意思,什么叫串行、什么叫并行、什么又叫并发呢?其实我们可以用生活中的常见的例子进行举例说明,那就特别好理解了。大家一定下过馆子,那么举个例子1:1.串行回收算法假设一个人去一个面馆吃面条,进入了一家面馆,然后进去了。点了一碗面,吃着,然后吃完就走了。那碗面汤还在桌上,没动。接着又一个人又进来吃面了,选了一个干净,没有面汤的桌子坐下了,也吃了一碗面走了。然后剩下的面汤也还在桌上,没动。假设这个面馆一共就6个位置,那么老板想着,只有面.原创 2020-12-06 15:34:45 · 835 阅读 · 2 评论 -
JVM内存分代模型(用于分代垃圾回收算法)
JVM内存分代模型(用于分代垃圾回收算法)1.部分垃圾回收器使用的模型2.新生代+老年代+永久代(1.7)/元数据区(metaspace 1.8)(1)永久代/元数据区----->Class(2)永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于机器的物理内存)(3)字符串常量 在jdk1.7的时候,在永久代中,在jdk1.8后,到堆内存中(4)methodArea逻辑概念---->永久代、元数据3.新生代 = Eden(伊甸园区)+2个suvivo原创 2020-12-06 15:29:48 · 373 阅读 · 0 评论 -
记一次线上环境节点OOM异常,直接导致节点宕机问题(及排查问题流程)
一、一个阳光明媚的早晨,运维兄弟发了条消息给我,说昨晚线上“xx服务”挂了。二、冷静分析:服务是集群环境的,单节点宕机,并不影响应用可用;三、进入分析阶段:1.拉取线上节点宕机 GC快照;2.通过jdk自带工具浏览GC内存占用情况(通过下述图片分析,由jdbc占用大量内存,导致内存溢出,右下图看出,直接占用上GB内存)3.走查代码,了解项目中存在使用原生jdbc业务场景,通过和其他初级开发人员沟通,找到存在一个 每月1号执行的定时任务:每个月1号建立一张分表,该分表的建立方案是,通过原创 2020-12-06 11:47:06 · 1314 阅读 · 0 评论 -
关于CAS问题解读 (自我认识表达)
起初,笔者本人第一次看到这个简写,cas,也是不了解的;但是对于笔者的性格,究其所以然。那么整起:我们先看下这个词的表述:CAS:Compare and Swap,比较再交换注意:此处我们咬文嚼字,比较再交换,比较再交换,比较再交换重要的事情读三遍,中国文化博大精深,相信各位很好理解:也就是,需要先比较之后,再进行交换。那么具体出现在什么地方呢?上源码:public final native boolean compareAndSwapObject(Object var1, .原创 2020-07-13 22:01:51 · 1019 阅读 · 0 评论