jvm(4) 对象创建
1.对象的创建过程:
1.new 类名
2.根据new的参数在常量池中定位一个类的符号的引用。
3.如果没找到这个符号的引用,说明类还没有被加载。则进行类的加载,解析和初始化
4.虚拟机为对象分配内存(位于堆中)。
5.将分配的内存初始化为零(不包括对象头),即抽象属性初始化为null,基本数据类型初始化为0.
、 6.调用对象的<init>方法
2.给对象分配内存的方式:
1.指针碰撞。这种方式前提是堆内存规整的并不是杂乱的,比如,将堆内存分为两块,一块是未使用的,一块是已经使用的。堆内存中未使用和已使用的交错存放则是不规整得 。
2.空闲列表。这种方式适用于堆内存不规整的。原理:虚拟机必须维护一张列表,这张列表记录堆中哪些内存块可用,哪些不可用。当分配内存中,就从这表中找出一块可用的内存
区域给新对象。再更新这张表。
内存的分配方式是有java中的堆是否规整来决定。而堆的规整是由垃圾回收策略来决定的。如果垃圾回收的过程中如果堆内存的 压缩整理,则应该使用指针碰撞
方式,反之则使用空闲列表。
3.在遇到高并发的情况下,给对象分配内存还会带来线程安全性问题。比如,一个线程进来给对象分配内存,在高并发的情况下,另外又有一个线程进来了,第一个线程还没来的及更新内存分配。而另外一个
线程刚好又申请了这块内存。这就导致了线程不安全问题。
解决方式:
1.线程同步。一个线程进来加一把锁,知道这个线程释放这把锁后,其他线程才能进来。这种方式也不失为一个解决办法。但是这种方式效率慢。
2.本地线程分配缓冲(TLAB)。做法就是为每一个线程分配一块单独的内存区域。这样就解决了线程不安全问题。而且效率大大提高。如果单独的内存区域满了后,我们还可以
继续利用线程同步再分配一块单独的内存区域给每一个线程。
详见 深入理解jvm虚拟机
jvm(4) 对象创建的更多相关文章
- 深入探究JVM之对象创建及分配策略
@ 目录 前言 正文 一.对象的创建方式 二.对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三.对象的访问定位 四.判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五.对象的分 ...
- JVM之对象创建、对象内存布局、对象访问定位
对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...
- jvm之对象创建过程
常量池中定位类的符号引用 ↓ 检查符号引用所代表的类是否已被加载,解析和初始化过 → ↓ ...
- JVM的艺术-对象创建与内存分配机制深度剖析
JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...
- JVM中对象的创建过程
JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...
- 深入理解JVM(2)——揭开HotSpot对象创建的奥秘
一.对象创建的过程:当虚拟机遇到一条含有New的指令时,会进行一系列对象创建的操作. 检查常量池中是否含有带创建对象所属类的符号引用 a) 如果含有的话,直接进行下一步 b) 如果常量池中没有这个符号 ...
- 读书笔记jvm探秘之二: 对象创建
对象是面向对象设计语言无法回避的东西,可见其重要性,JAVA的对象相较于C++来说,不算很复杂,但是我们看到一句话背后往往有很多东西值得探讨(NEW关键字). 对象如何被创建? 首先一句简单的NEW语 ...
- JVM系列一(Java内存区域和对象创建).
一.JVM 内存区域 堆 - Heap 线程共享,JVM中最大的一块内存,此内存的唯一目的就是存放对象实例,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称为"GC堆"( ...
- JVM对象创建
1.JVM对象创建:java程序运行过程中,无时无刻都有对象被创建出来.在语言层面上就是new关键字. 2.JVM对象创建过程: (1)JVM遇到一条new指令后,首先会去常量池中,检查这个指令的参数 ...
随机推荐
- d3与echarts的区别
1. 目前各大公司的大数据平台多使用d3还是echarts?什么时候适合用echarts,什么时候适合用d3? 在我看几种数据可视化平台多使用折线图,面积图和柱状图,条图居多,对于echarts和d3 ...
- 基于firebird的数据转存
功能:使用于相同的表从一个数据库转存到另一数据库: 方式:直连fdb并加载django,引用django的model完成: 原因:1.select * from *** 返回的数有很多None,直接i ...
- K8S进入容器方法
前言 k8s如何进入一个pod里有多个容器的方法 参考地址 https://blog.csdn.net/aa1215018028/article/details/81205691 方法1 kubect ...
- java并发学习--第三章 线程安全问题
线程的安全问题一直是我们在开发过程中重要关注的地方,出现线程安全问题的必须满足两个条件:存在着两个或者两个以上的线程:多个线程共享着共同的一个资源, 而且操作资源的代码有多句.接下来我们来根据JDK自 ...
- 2018-10-01-weekly
Algorithm 77. 组合 What 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. How 利用递归的思想,当凑够k个数时,就回退回去,remove掉一个数,在 ...
- 在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问,并可修改MySQL密码
这两天装了一个mysql 5.7数据库,但是在本地dos登陆不上去,报错Access denied for user 'root'@'localhost'(using password:YES): 也 ...
- 2019届校招前端面试题整理——HTML、CSS篇
前言 2019届校招陆陆续续开始了,整理了一些高频的面试题. HTML部分 1. 什么是<!DOCTYPE>? DOCTYPE是html5标准网页声明,且必须声明在HTML文档的第一行.来 ...
- rocketmq启动broker内存占用过大的问题
解决方法: 修改broker启动脚本runbroker.sh里面的jvm参数 JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" ...
- Eclipse使用maven创建SSM-web项目
1.环境准备 (1)maven:apache-maven-3.5.2,我的maven安装在D:\apache-maven-3.5.2,eclipse中maven配置如下: 先add ,添加好自己的ma ...
- 图片没有.png或者jpg后缀能不能加载?
是可以的,如:http://mmbiz.qpic.cn/mmbiz_png/MW1VecOrnw6HUMvEUNUxibLVtbY2vHF8QkFyviaickh8pnsapQ8gOosdq13SBX ...