2019独角兽企业重金招聘Python工程师标准>>>
运行时数据区域
直接内存
频繁被使用
jdk1.4加入NIO(New Input/Output),一种基于通道与缓冲区的I/O方式,
可以使用Native函数库直接分配堆外内存,通过java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样避免了在Java堆和Native堆中来回复制数据,提高性能。
注意:此部分的内存不受java堆大小的限制,收本机总内存的限制,配置虚拟机内存时,不能够忽略此处的内存,否则会导致动态扩展时出现OutOfMemoryError异常。
HotSpot
对象的创建:
new指令 --》检查指令参数能否在常量池中定位一个类的符号引用,这个符号代表的类是否已被加载、解析和初始化过。----》如果没有,必须先执行相应的类加载过程 -----》为新生对象分配内存
分配内存方式:指针碰撞(堆内存绝对规整)
空闲列表(堆内存不是规整的)
是否规整由采用的垃圾收集器是否带有压缩整理功能决定。
对象的频繁创建(高并发)解决方案:
方案一:同步处理,采用CAS配上失败重试,保证跟新操作的原子性;
方案二:内存分配的动作按照线程划分在不同的空间之中进行。(本地线程分配缓冲 Thread Local Allocation Buffer ,TLAB)
---》虚拟机对对象进行必要的设置(该对象是哪个类的实例,对象的哈希码值)
----》一个对象产生了(从虚拟机视角)
对象创建刚刚开始(从java程序的视角) ------<init>方法还没有执行。
对象的内存布局: