精华内容
下载资源
问答
  • Java对象的组成

    千次阅读 2021-01-20 13:25:01
    java的对象头由以下三部分组成: 1,Mark Word 2,指向类指针 3,数组长度(只有数组对象才有)   1,Mark Word Mark Word记录了对象和锁有关信息,当这个对象被synchronized关键字当成同步锁...

    Java对象保存在内存中时,由以下三部分组成

    1,对象头

    2,实例数据

    3,对齐填充字节

    一,对象头

    java的对象头由以下三部分组成:

    1,Mark Word

    2,指向类的指针

    3,数组长度(只有数组对象才有)

     

    1,Mark Word

    Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。

    Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。

    Mark Word在不同的锁状态下存储的内容不同,在32位JVM中是这么存的:

    锁状态

    25bit

    4bit

    1bit

    2bit

    23bit

    2bit

    是否偏向锁

    锁标志位

    无锁

    对象的HashCode

    分代年龄

    0

    01

    偏向锁

    线程ID

    Epoch

    分代年龄

    1

    01

    轻量级锁

    指向栈中锁记录的指针

    00

    重量级锁

    指向重量级锁的指针

    10

    GC标记

    11

    其中无锁和偏向锁的锁标志位都是01,只是在前面的1bit区分了这是无锁状态还是偏向锁状态。

    JDK1.6以后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的,随着竞争越来越激烈,处理方式从偏向锁升级到轻量级锁,最终升级到重量级锁。

     

    JVM一般是这样使用锁和Mark Word的:

    1,当没有被当成锁时,这就是一个普通的对象,Mark Word记录对象的HashCode,锁标志位是01,是否偏向锁那一位是0。

    2,当对象被当做同步锁并有一个线程A抢到了锁时,锁标志位还是01,但是否偏向锁那一位改成1,前23bit记录抢到锁的线程id,表示进入偏向锁状态。

    3,当线程A再次试图来获得锁时,JVM发现同步锁对象的标志位是01,是否偏向锁是1,也就是偏向状态,Mark Word中记录的线程id就是线程A自己的id,表示线程A已经获得了这个偏向锁,可以执行同步锁的代码。

    4,当线程B试图获得这个锁时,JVM发现同步锁处于偏向状态,但是Mark Word中的线程id记录的不是B,那么线程B会先用CAS操作试图获得锁,这里的获得锁操作是有可能成功的,因为线程A一般不会自动释放偏向锁。如果抢锁成功,就把Mark Word里的线程id改为线程B的id,代表线程B获得了这个偏向锁,可以执行同步锁代码。如果抢锁失败,则继续执行步骤5。

    5,偏向锁状态抢锁失败,代表当前锁有一定的竞争,偏向锁将升级为轻量级锁。JVM会在当前线程的线程栈中开辟一块单独的空间,里面保存指向对象锁Mark Word的指针,同时在对象锁Mark Word中保存指向这片空间的指针。上述两个保存操作都是CAS操作,如果保存成功,代表线程抢到了同步锁,就把Mark Word中的锁标志位改成00,可以执行同步锁代码。如果保存失败,表示抢锁失败,竞争太激烈,继续执行步骤6。

    6,轻量级锁抢锁失败,JVM会使用自旋锁,自旋锁不是一个锁状态,只是代表不断的重试,尝试抢锁。从JDK1.7开始,自旋锁默认启用,自旋次数由JVM决定。如果抢锁成功则执行同步锁代码,如果失败则继续执行步骤7。

    7,自旋锁重试之后如果抢锁依然失败,同步锁会升级至重量级锁,锁标志位改为10。在这个状态下,未抢到锁的线程都会被阻塞。

     

    2,指向类的指针

    该指针在32位JVM中的长度是32bit,在64位JVM中长度是64bit。

    Java对象的类数据保存在方法区。

     

    3,数组长度

    只有数组对象保存了这部分数据。

    该数据在32位和64位JVM中长度都是32bit。

     

    二,实例数据

    对象的实例数据就是在java代码中能看到的属性和他们的值。

     

    三,对齐填充字节

    因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。

    展开全文
  • Java对象的组成部分

    千次阅读 2020-04-09 15:52:30
    每一个对象都由对象头、对象的实例数据区和对齐填充字节这三部分组成。 1. 对象头 对象头由三部分组成: Mark Word:记录对象和锁的有关信息。当一个对象被 synchronized 关键字加锁之后,围绕锁的操作就都会和Mark...

    每一个对象都由对象头、对象的实例数据区和对齐填充字节这三部分组成。

    1. 对象头

    对象头由三部分组成:

    1. Mark Word:记录对象和锁的有关信息。当一个对象被 synchronized 关键字加锁之后,围绕锁的操作就都会和MarkWord有关联。MarkWord通常都是 32 bit位大小。会保存一些分代年龄、无锁状态下对象的HashCode、偏向锁的线程ID、轻量级锁指向栈中锁记录的指针、指向重量级锁的指针、锁的标志位等内容。
    2. 指向类的指针:大小也通常为32bit,它主要指向类的数据,也就是指向方法区中的位置。
    3. 数组长度:只有数组对象才有,在32位或者64位JVM中,长度都是32bit。

    2. 实例数据区

    该区域主要就存放着实例对象的一些字段属性内容。

    3. 对齐填充字节

    由于JVM要求Java对象所占的内存大小应该是8bit的倍数,所以这部分主要就是将对象大小补充为8bit的倍数,没有别的功能。

    展开全文
  • java对象的组成

    千次阅读 2018-08-01 01:16:35
    不积跬步无以至千里,不积小流无以成江海。 在Java中,一旦创建了一个类,我们就可以在类中定义成员变量(有的也叫做字段或者数据成员)和成员方法。成员变量可以是任何类型的变量,可以通过引用...若字段是对象的...

                                                                                         不积跬步无以至千里,不积小流无以成江海。

    在Java中,一旦创建了一个类,我们就可以在类中定义成员变量(有的也叫做字段或者数据成员)和成员方法。成员变量可以是任何类型的变量,可以通过引用与其通信,也可以是基本类型。若字段是对象的引用,那么必须对其进行初始化,使其与一个对象关联。

    如果某个类的成员变量是基本数据类型,那么没有对它进行初始化操作,Java也会确保给它一个默认值。下面的表给出了各个基本类型的默认值

    基本数据类型 默认值
    boolean false
    byte (byte)0
    short (short)0
    int 0
    long 0L
    float 0.0f
    double 0.0d
    char '\u0000'    (这个Unicode码表示一个空格)

     

    注意:如果基本类型不是成员变量,而是作为局部变量存在,则在使用前要给其赋予适当的值,否则编译时报错。

    另外,一个byte数据在内存占一个字节,short为2字节,int是4字节,long是8字节,char为2字节,float是4字节,double是8字节。

    Java为避免命名冲突希望程序员采用反转域名的方式,句点代表子目录的划分。

     

    下面也来初步讲一讲static关键字:

    当一个事物使用static关键字声明时,就表明这个域或者方法不与该类的任何对象相关联。即使我们没有创建任何对象,我们仍然可以通过类名来调用这个域或者方法。当然,我们也可以通过创建对象用对象来调用它。如上一篇中所讲的static声明的变量或方法属于该类伴生的class对象。

    因为static不属于该类创建的任何对象,所以static字段对于所有该类创建的对象只有一份存储空间,也就是说一个对象对static字段修改其他对象对其引用都是修改后的结果。

    Java中的java.lang包是默认被导入到每个Java文件中的,所以其中的所有类都可以直接被使用。 

     

    注释文档:Java中为方便对文档的维护,将代码同文档链接起来。javadoc工具可用于提取代码中的由注释语法所写的注释的。javadoc输出的是HTML文件,可以用web浏览器查看。

    语法为:

    所有Javadoc命令都只能在"/**"注释中出现,结束于“*/”。使用javadoc的方式有两种:嵌入式HTML或使用“文档标签”。独立文档标签一般以“@”字符开头的命令,其置于注释行的最前面。行内文档标签可以出现在javadoc注释的任何地方,也以“@”开头,但是要在花括号内。

    展开全文
  • response对象的组成及应用

    千次阅读 2017-04-08 15:52:42
    request和response对象既然代表请求与响应,那我们要获取客户机提交过来数据,只需要找request对象就行了,要向客户机输出数据,只需要找response对象就行了。 HttpServletResponse对象服务器响应。这个对象中...

    web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象既然代表请求与响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了,要向客户机输出数据,只需要找response对象就行了。
    HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

    这里写图片描述

    一,response响应的构成:
    响应行:
    状态码(Status Code):void setStatus(int sc) 设置状态码;常用的状态码有:200(请求成功处理),302(请求重定向),304(服务器段资源没有改动,通知客户端查找本地资源),404(客户端的访问资源不存在),500(服务器内部出错)
    响应头: Header Info(key:value的形式,一个key对应一个value,一个key对应多个value)
    设置头信息:
    void setHeader(String name, String value) (一个key对应一个value)经常使用的;eg:setHeader(“aa”,”bb”); setHeader(“aa”,”cc”); 结果:aa:cc
    setHeader(String,String) 替换原有值
    addHeader(String,String) 在原有值添加
    void setIntHeader(String name, int value)
    void setDateHeader(String name, long date) 值是毫秒值(int 秒 long 毫秒)
    void addHeader(String name, String value) (一个key对应多个value) eg:addHeader(“aa”,”bb”); addHeader(“aa”,”cc”); 结果:aa:bb,cc

    响应体
    ServletOutputStream getOutputStream() 字节输出流
    PrintWriter getWriter() 字符输出流

    二,下面为一些response状态码和头信息的应用:
    (1)通过response实现请求重定向
    请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向,302(状态码)+Location(应用头) —— response.sendRedirect
    例如:用户登陆时,用户名密码错误,重定向回登陆页面

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 获得请求中 用户名和密码
        String username = request.getParameter("username");
        // 字符串要为form表单对象name属性
        String password = request.getParameter("password");
        // 假设admin/admin 就是用户名和密码
        if (username.equals("admin") && password.equals("admin")) {
        // 登陆成功
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println("登陆成功!");
        } else {
        // 用户名或者密码错误 ---- 重定向登陆页面
        // response.setStatus(302);
        // response.setHeader("Location", "/study/response/demo.html");
        response.sendRedirect("/study/response/demo.html");
        }
    }

    (2)发送http头,控制浏览器定时刷新网页(refresh),用到,响应头refresh。利用HTML标签来控制浏览器行为

    //定时刷新
    response.setHeader("refresh", "5;url=/study/hello.html");
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().println("页面会在5秒后 自动跳转hello.html");
    //HTML中meta标签,可以产生Http响应头信息相同效果 
    <meta http-equiv="refresh" content="5;url=/study/response/login.html">

    其中:http-equiv 响应头信息name,content 响应头信息value

    (3)禁用浏览器缓存(三个头信息)
    发送http头,控制浏览器禁止缓存当前文档内容,通过设置三个Http头信息禁用浏览器缓存,分别为:
    Cache-Control : no-cache
    Pragma : no-cache
    Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以)

    // 设置response 的三个头信息
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    // Expires 要求格式为日期格式
    // 通过setDateHeader设置一个毫秒信息,自动转换日期格式
    response.setDateHeader("Expires", -1);

    有些动态页面,每次访问内容都不同,如果浏览器缓存页面,无法查看最近内容,禁用缓存通常应用与网银,页面的数据是发生变化的。

    (4)response向页面输出中文(乱码问题)
    1)字节流输出中文:ServletOutputStream getOutputStream() ,为字节输出流。会发生乱码和浏览器的编码有关,解决办法是:可以设置浏览器默认打开时候的编码集,在获得字节数组的时候,传入一个编码集。

    //设置浏览器默认打开时的编码
       response.setHeader("Content-Type", "text/html;charset=UTF-8");
    //设置获取字节数组时的编码
       response.getOutputStream().write("中文".getBytes("UTF-8"));

    2)字符流输出中文:PrintWriter getWriter(),为字符输出流。
    因为response的字符流的缓冲区是ISO-8859-1编码,所以肯定会发生乱码,解决的办法是:设置response缓冲区的编码,设置浏览器默认打开时候的字符集编码。

    //设置response缓冲区的编码.
       response.setCharacterEncoding("UTF-8");
    //设置浏览器打开文件的时候采用的编码
       response.setHeader("Content-Type", "text/html;charset=UTF-8");
    //简写方式
     response.setContentType("text/html;charset=UTF-8");

    注意:
    1,字节流与字符流是互斥的,同一个页面只能使用一种流,不同同时向页面响应;
    2,使用字符流输入数字时,有可能存在问题,所以想要输入数字时,使用字符串。例如:“1”。
    3,getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
    4, Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
    5,Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。调用close的时候,应该会调用flushBuffer

    (5)实现文件的下载(初级下载)
    1)超链接,浏览器可以解析直接打开(如果浏览器不能识别的格式,会弹出下载窗口。但是如果浏览器识别的话,会默认打开文件)。
    2)弹出下载窗口:
    前提条件:先准备一个文件,然后读取文件,读入到输入流中,通过response读出到浏览器端。设置头信息:response.setHeader(“Content-Disposition”,” attachment;filename=”+文件名称);通过response.getOutputStream()向浏览器端输出。

    (6)输出验证码图片
    1)在内存中生成图片:可以使用BufferedImage对象,该对象可以获取画笔对象
    getGraphics();
    2)随机生成字母或数字:可以使用Random对象;
    3)把生成的数字或字母写在图片上:通过画笔中的方法;
    4)把图片生成到页面上:可以使用ImageIO对象。
    具体的操作如下:

    //建立BufferedImage对象:指定图片的长度宽度和类型:
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //取得Graphics对象,用来绘制图片 
    Graphics graphics = image.getGraphics();
    //绘制背景颜色
    graphics.setColor(Color.WHITE);
    graphics.fillRect(0, 0, width, height);
    //绘制边界
    graphics.setColor(Color.BLUE);
    graphics.drawRect(0, 0, width - 1, height - 1);
    //生成随机数
    Random random = new Random();
    random.nextInt(n); // 生成0到n的随机数,前闭后开
    //绘制干扰线
    graphics.drawLine(x1, y1, x2, y2);
    //设置字体(如果验证码是中文,要使用中文的字体库)
    graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
    //通过词库生成随机验证码内容
    //"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    //汉字:\u4e00 —— \u9fa5
    graphics.drawString(str, x, y);
    //设置旋转
    Graphics2D graphics = (Graphics2D) image.getGraphics();
    graphics.rotate(theta, x, y);
    //释放此图形的上下文以及它使用的所有系统资源
     graphics.dispose();
    //通过ImageIO对象的write静态方法将图片输出 
    ImageIO.write(image, "jpg", resp.getOutputStream());
    展开全文
  • Polygon对象和Polyline对象的组成形式

    千次阅读 2014-06-29 10:50:09
    Polygon对象
  • WebStrom 下载及安装、实例、undefined与null区别?什么时候给变量赋值为null呢?严格区别变量类型与数据类型?关于引用变量赋值问题、数据传递问题、内存管理、访问对象内部数据
  • java中举个由两个对象组成的对象数组,由n个对象组成的对象数组例子
  • Java的对象头和对象组成详解

    万次阅读 多人点赞 2018-07-20 10:46:47
    目录 一,对象头 1,Mark Word 2,指向类指针 3,数组长度 ...java的对象头由以下三部分组成: 1,Mark Word 2,指向类指针 3,数组长度(只有数组对象才有)   1,Mark Word Mar...
  • Java对象组成查看信息

    千次阅读 2021-01-20 14:17:42
    查看对象的组成信息 包括偏向状态,锁状态标志,对齐填充,实例大小,空间损耗 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <...
  • 对象基本组成和内存

    2020-05-24 22:20:24
    对象基本组成和内存 Python中,一切皆对象。 每个对象由:标识( identity )、类型( type)、value (值)组成。 1.标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。...对象的本质就是: 一个内存块,拥有特定的值,
  • 对象数组 var list = [ { melonbody: 8.4, strName: '损伤程度', level: '一等品' }, { colorvalue: 8.42, strName: '颜色', level: '一等品' }, { diameter: 8.4, strName: '直径', level: '一等品' }, {...
  • jquery对象可以(假设)当做js对象的数组使用. 及时可以理解为一个jquery对象是由多个js对象组成的.
  • js把数组对象的某个属性的值提取出来组成新的数组 解决方法: 假如我想获取数组中对象的id属性的值组成新的字符串数组,直接使用map遍历return即可:http://www.yayihouse.com/yayishuwu/chapter/2585
  • 对象的基本组成和内存示意图 对象 Python中,一切皆对象。每个对象由:三部分组成标识、类型、值 标识(identity):对应于对象在计算机内存中的地址。 使用内置函数id(obj)可以返回对象obj的标识 2. 类型...
  • 对象组成的数组如何去重?

    万次阅读 多人点赞 2018-06-11 20:19:06
    对象组成的数组如何去重? 需求:将下面data数组中id重复数据去掉? let data = [ { id: 201801, name: '张三', age: 15, }, { id: 201804, name: 'John', age: 18, }, { id: 201802, name: '...
  • JavaScript 将数组中具有相同值的对象 取出组成数组 var arr=[{name:2,id:3},{name:2,id:4},{name:3,id:5},{name:3,id:6},{name:1,id:1},{name:1,id:2}]; // 传入一个数组 // 按照特定方式...
  • 对象组成的数组 对照删除 一个表格,类似于下图,选中以后,做成纯前端批量删除 数据源 arr2是全部数据,arr1是勾选数据 let arr1 = [ { code: "123456781",color: "芭比粉"}, { ...
  • 没有实体类的对象组成的list,获取其中属性值 按元素位置确实其属性值位置。 List list = new arrayList(); String hql=""; list = commonservice.getQuertListBySql(hql); 先得到一个集合,将查询出结果...
  • 对象的基本组成和内存以及引用 对象 python中,一切皆对象。每个对象由:标识(identity) 类型(type) value(值)组成 标识用于唯一标识对象,通常对应于对象在计算机内存。使用内置函数id(obj)可返回对象obj的...
  • js获取对象数组的某个属性集合 ...假如我想提取数组currentDateItemList中对象的id属性组成新的数组,可使用map结合assign实现,具体代码参考:http://www.yayihouse.com/yayishuwu/chapter/2583 ...
  • $('.myclass')是获取对象集合,那么怎么把这个集合值变成一个数组 例如 $.each($('.myClass'),function(){ alert($(this).val()); // 要把这里值变成一个数组[val1,val2,val3,...] });
  • 如图,如果要提取这个这个json数组对象这些元素该怎么办呢,下面是我办法: 假定dataList为这个要提取数组,首先获取到该数组下device数组和item数组 var deviceInfos = []; //device数组 var item...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,848
精华内容 24,339
关键字:

对象的组成