![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java虚拟机
weixin_29879269
这个作者很懒,什么都没留下…
展开
-
java堆和直接内存的区别
NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的限制;而DirectBuffer直接分配在物理内存中,并不占用堆空间,其可申请的最大内存受操作系统限制。 直接内存的读写操作比普...转载 2019-05-05 16:49:26 · 475 阅读 · 0 评论 -
指针碰撞
假设java堆中内存是绝对规整的,所有用过的内存放一边,未使用过的放一边,中间有一个指针作为临界点,如果新创建了一个对象则是把指针往未分配的内存挪动与对象内存大小相同距离,这个称为指针碰撞。 ...原创 2019-05-05 17:00:49 · 1826 阅读 · 0 评论 -
java内存分配方式
1.指针碰撞(上一节有说明) serial,parnew等带Compact过程的收集器 2.空闲列表 若内存空间不是规整就需要虚拟机维护一个记录表记录哪些内存块是可用的,在分配空间的时候分配给实例对象足够大的空间,并更新虚拟机的表记录。 CMS基于mark-sweep算法的收集器 ...原创 2019-05-05 18:57:03 · 275 阅读 · 0 评论 -
java对象内存布局
在hotspot对象的存储空间可以分为3块区域 1.对象头 对象头包含两部分信息 a.运行时的数据(哈希码,GC分代年龄,锁状态,线程持有的锁,偏向线程id等)官方称为mark word b.类型指针 指向元数据的指针,虚拟机通过这个指针确定对象属于哪个类的实例。并不是所有的对象都需要保留对象指针。换句话说查找对象的元数据并不需要经过对象本身。还有如果对象是个数组还需要记录数组大小,因为虚拟机可...原创 2019-05-06 10:47:52 · 84 阅读 · 0 评论 -
java对象访问定位
建立对象是为了使用对象,我们的java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在java虚拟机规范中只规定一个指向对象的引用,并没有定义 这个对象引用应该通过哪种方式去定位,访问堆中对象的具体位置。所以对象的访问也是取决于虚拟机实现而定。目前有以下两种方式: 使用句柄访问: java堆中会划分处一块内存来作为句柄池reference存储的就是对象句...原创 2019-05-06 12:00:31 · 138 阅读 · 0 评论 -
java方法区和运行时常量池直接内存溢出
常量池:String.intern()是一个Native方法,他的作用是如果常量池中已经包含一个等于String对象的字符串,则返回代表池中这个字符串String对象,否则将此字符串放到常量池中,并返回对象的引用。在jdk1.6之前常量池放在永久代,因此可能会出现常量池溢出 方法区:方法区存放Class相关信息 直接内存: ...原创 2019-05-06 12:37:36 · 395 阅读 · 0 评论