成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

字節跳動面試官這樣問有關字符串的問題!!

新聞
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。

 [[381290]]

作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

寫在前面

對于Java中的String類占用多大的內存空間這個問題,是最近面試中問的比較多的一個問題。很多小伙伴的回答的都不是很正確,有說不占空間的,有說1個字節的,有說2個字節的,有說3個字節的,有說不知道的,更讓人哭笑不得的是竟然還有人說是2的31次方。那如果真是這樣的話,服務器的內存空間還放不下一個字符串呀!作為程序員的我們,可不能鬧這種笑話呀。今天,我們就一起來聊聊Java中的String到底占用多大的內存空間!

Java對象的結構

首先,我們來下Java對象在虛擬機中的結構,這里,以HotSpot虛擬機為例。

 

注:圖片來源http://r6d.cn/wp7q

從上面的這張圖里面可以看出,對象在內存中的結構主要包含以下幾個部分:

  • Mark Word(標記字段):對象的Mark Word部分占4個字節,其內容是一系列的標記位,比如輕量級鎖的標記位,偏向鎖標記位等等。
  • Klass Pointer(Class對象指針):Class對象指針的大小也是4個字節,其指向的位置是對象對應的Class對象(其對應的元數據對象)的內存地址
  • 對象實際數據:這里面包括了對象的所有成員變量,其大小由各個成員變量的大小決定,比如:byte和boolean是1個字節,short和char是2個字節,int和float是4個字節,long和double是8個字節,reference是4個字節
  • 對齊:最后一部分是對齊填充的字節,按8個字節填充。

換種說法就是:

  • 對象頭(object header):8 個字節(保存對象的 class 信息、ID、在虛擬機中的狀態)
  • Java 原始類型數據:如 int, float, char 等類型的數據
  • 引用(reference):4 個字節
  • 填充符(padding)

Java中的String類型

空String占用的空間

這里,我們以Java8為例進行說明。首先,我們來看看String類中的成員變量。

  1. /** The value is used for character storage. */ 
  2. private final char value[]; 
  3.   
  4. /** Cache the hash code for the string */ 
  5. private int hash; // Default to 0 
  6.   
  7. /** use serialVersionUID from JDK 1.0.2 for interoperability */ 
  8. private static final long serialVersionUID = -6849794470754667710L; 

在 Java 里數組也是對象,因此數組也有對象頭。所以,一個數組所占的空間為對象頭所占的空間加上數組長度加上數組的引用,即 8 + 4 + 4= 16 字節 。

所以,我們可以得出一個空String對象所占用的內存空間,如下所示。

  1. 對象頭(8 字節)+ 引用 (4 字節 )  + char 數組(16 字節)+ 1個 int(4字節)+ 1個long(8字節)= 40 字節 

所以,小伙伴們,你們的回答正確嗎?

非空String占用的空間

如果String字符串的長度大于0的話,我們也可以得出String占用內存的計算公式,如下所示。

  1. 40 + 2 * n 

其中,n為字符串的長度。

這里,可能有小伙伴會問,為什么是 40 + 2 * n 呢?這是因為40是空字符串占用的內存空間,這個我們上面已經說過了,String類實際上是把數據存儲到char[]這個成員變量數組中的,而char[]數組中的一個char類型的數據占用2個字節的空間,所以,只是String中的數據就會占用 2 * n(n為字符串的長度)個字節的空間,再加上空字符串所占用的40個字節空間,最終得出一個字符串所占用的存儲空間為:40 + 2 * n (n為字符串長度)。

因此在代碼中大量使用String對象時,應考慮內存的實際占用情況。

注:40 + 2 * n 這個公式我們可以看成是計算String對象占用多大內存空間的通用公式。

驗證結論

接下來,我們就一起來驗證下我們上面的結論。首先,創建一個UUIDUtils類用來生成32位的UUID,如下所示。

  1. package io.mykit.binghe.string.test; 
  2.  
  3. import java.util.UUID; 
  4.  
  5. /** 
  6.  * @author binghe 
  7.  * @version 1.0.0 
  8.  * @description 生成沒有-的UUID 
  9.  */ 
  10. public class UUIDUtils { 
  11.  public static String getUUID(){ 
  12.   String uuid = UUID.randomUUID().toString(); 
  13.   return uuid.replace("-"""); 
  14.  } 

接下來,創建一個TestString類,在main()方法中創建一個長度為4000000的數組,然后在數組中放滿UUID字符串,如下所示。

  1. package io.mykit.binghe.string.test; 
  2.  
  3. import java.util.UUID; 
  4.  
  5. /** 
  6.  * @author binghe 
  7.  * @version 1.0.0 
  8.  * @description 測試String占用的內存空間 
  9.  */ 
  10. public class TestString{ 
  11.     public static void main(String[] args){ 
  12.          String[] strContainer = new String[4000000]; 
  13.         for(int i = 0; i < 4000000; i++){ 
  14.             strContainer[i] = UUIDUtils.getUUID(); 
  15.             System.out.println(i); 
  16.         } 
  17.         //防止程序退出 
  18.         while(true){ 
  19.  
  20.         } 
  21.     } 

這里,4000000個字符串,每個字符串的長度為32,所以保存字符串數據所占用的內存空間為:(40 + 32 * 2) * 4000000 = 416000000字節,約等于416MB。

我們使用Jprofiler內存分析工具進行分析:

 

可以看到,使用Jprofiler內存分析工具的結果為:321MB + 96632KB,約等于417MB。之所以使用Jprofiler內存分析工具得出的結果比我們計算的大些,是因為在程序實際運行的過程中,程序內部也會生成一些字符串,這些字符串也會占用內存空間!!

所以,使用Jprofiler內存分析工具得出的結果符合我們的預期。

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2021-04-21 09:28:17

字節面試官SetTimeout

2010-08-23 15:06:52

發問

2021-11-08 09:18:01

CAS面試場景

2021-12-25 22:31:10

MarkWord面試synchronize

2021-12-16 18:38:13

面試Synchronize

2025-03-18 12:00:00

閉包JavaScript前端

2021-12-02 18:20:25

算法垃圾回收

2025-06-03 07:05:00

Linux操作系統Windows

2021-01-06 05:36:25

拉鏈表數倉數據

2020-07-28 00:58:20

IP地址子網TCP

2021-02-02 18:03:00

字符串面試官子序列

2021-02-18 07:45:09

redis 字符串SDS

2021-02-23 09:35:33

redis字符串數據庫

2021-04-27 10:53:58

Redis數據庫SDS

2022-01-05 09:55:26

asynawait前端

2025-02-10 00:00:25

內存管理開發

2023-09-26 00:37:38

Spring微服務框架

2020-12-10 08:43:17

垃圾回收JVM

2018-04-23 11:00:44

PythonRedisNoSQL

2018-01-19 10:43:06

Java面試官volatile關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区久久久久久久网精 | 午夜影院操 | 美女天天操 | 日本精品免费在线观看 | 五月婷婷激情网 | 91极品欧美视频 | 欧美成人精品一区二区男人看 | 日韩欧美视频在线 | 黄色免费在线观看网址 | 玖玖综合在线 | 国产精品福利在线 | 精品人伦一区二区三区蜜桃网站 | 欧美一级观看 | 精品国产第一区二区三区 | 综合久久久久久久 | 黄色精品| 国产99久久精品一区二区300 | 欧美日韩网站 | 中文字幕一区二区三区乱码在线 | 看一级黄色毛片 | 亚洲精品v | 国产丝袜av | 国产人成在线观看 | 中文字幕一区在线观看视频 | 国产成人综合久久 | 中文字幕视频在线观看免费 | 午夜影院在线观看 | 亚洲成人在线免费 | 国产丝袜人妖cd露出 | 国产成人精品久久二区二区91 | 欧美精品网站 | 国产乱码精品一区二区三区忘忧草 | 精品一二三区视频 | 精品中文字幕在线 | 日韩欧美一区二区三区免费看 | 性色视频 | 操操日 | 亚洲一区二区三区在线免费 | 国产高潮好爽受不了了夜色 | 欧美精品一区三区 | 国产成人艳妇aa视频在线 |