简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于在Java虚拟机规范里面只规定了reference类型是一个指向对象的引用,并没有定义这个引用应该通过什么种方式去定位、访问到堆中的对象的具体位置,所以对象访问方式也是取决于虚拟机实现而定的。主流的访问方式有使用句柄和直接指针两种。使用句柄使用句柄访问的话,Java堆中将会划分出一块内存来作为句柄池,refe
在前面我们了解了Java对象在JVM中的创建过程,接下来我们再来分析一下对象在JVM中的内存布局。在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据( Instance Data)和对齐填充(Padding)。如下图所示(原谅我盗用了两张图。两张图是一样的,只是表达方式不一样,大家看看哪个好记吧!):接下来我们分析其中的每一部分。
在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?首先来看一下JVM创建对象时的流程图:Created with Raphaël 2.1.2开始JVM 执行 new 指令类已加载?为新生对象分配内存内存规整?指针碰撞并发处理:同步或TLAB将分配到的内存空间初始化为零值JVM
Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问却经常出错,因此在某些
文章内容来自《深入理解JVM》和网络资料的整理Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存;回收分配给对象的内存。对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上。少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参数设置。下面先简单介绍一下JVM中的年代划分:新生代、老年代、
我觉得这个东西很重要的啊,每次重新安装之后都要搞一番,花费太多时间,写个东西记录一下,也给各位小伙伴做个参考。先说一下我是用的环境:VMware Pro 14、CentOS 7、Windows 10接下来说一下配置,配置很简单,重要的是理解为什么这个做,后面我会引用几篇文章帮助大家理解配置过程(只需四步)第一步:设置网络适配器为 NAT 模式第二步:进入虚拟网络...
一、路由的基础知识1、路由概念路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程;路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备;路由表:在路由器中维护的路由条目,路由器根据路由表做路径选择;直连路由:当在路由器上配置了接口的IP地址,并且接口状态为up的时候,路由表中就出现直连路由项;静态路由:是由管理员手工配置的,是单向的;默认路由:
情景有天看到有开发同事A在讨论群里说,一测试环境中某服务打印了大量的日志,把磁盘打满了。这位同事把日志清理了,并请群里的相关人员看下是否需要重启各自的服务。过一会儿,同事B说其中一服务虽然重新启动了,但并未正常启动,因为启动日志中依然显示着… No space left on device …。前有同事A说磁盘满并把日志清了,后有同事说磁盘还是没有剩余空间。这前后矛盾的现象,激起了我的兴趣,...
在linux下的很多软件都是通过源码包方式发布的,这样做对于最终用户而言,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包,不同的最终用户经过编译就可以正确运行,这也是非常符合c语言的设计哲学的,一次编写,到处编译么,而常见的二进制包,比如rpm和deb,软件开发者必须为每种特定的平台定制好专门的软件包,这个通过rpm文
Dockerfile介绍Docker通过读取Dockerfile里面的内容可以自动build image,Dockerfile是一个包含了build过程中需要执行的所有命令的文本文件。也可以理解为Dockfile是一种被Docker程序解释的脚本,由一条一条的指令组成,每条指令对应Linux系统下面的一条命令,由Docker程序将这些Dockerfile指令翻译成真正的Linux命令。Do...