GVKun编程网logo

找出Python中某个对象正在使用多少内存[(python找出只出现一次的元素)

23

本文将为您提供关于找出Python中某个对象正在使用多少内存[的详细介绍,我们还将为您解释python找出只出现一次的元素的相关知识,同时,我们还将为您提供关于C#/NET对象使用多少内存?、C#/。

本文将为您提供关于找出Python中某个对象正在使用多少内存[的详细介绍,我们还将为您解释python找出只出现一次的元素的相关知识,同时,我们还将为您提供关于C#/NET对象使用多少内存?、C#/。NET对象使用多少内存?、Java如何获取JSON中某个对象的值、new一个Object对象占用多少内存?的实用信息。

本文目录一览:

找出Python中某个对象正在使用多少内存[(python找出只出现一次的元素)

找出Python中某个对象正在使用多少内存[(python找出只出现一次的元素)

您将如何查找对象正在使用多少内存?我知道有可能找出一个代码块,而不是实例化对象(在其生命中的任何时候)要使用多少,这就是我想要的。

答案1

小编典典

尝试这个:

sys.getsizeof(object)

如果对象是由垃圾收集器管理的,则getsizeof()调用该对象的__sizeof__方法并增加额外的垃圾收集器开销。

C#/NET对象使用多少内存?

C#/NET对象使用多少内存?

我正在开发一个应用程序,目前已创建了数百个对象。

是否可以确定(或近似)由对象(类实例)分配的内存?

C#/。NET对象使用多少内存?

C#/。NET对象使用多少内存?

我正在开发一个应用程序,目前已创建了数百个对象。

是否可以确定(或近似)由对象(类实例)分配的内存?

答案1

小编典典

您可以使用类似的内存分析器

.NET内存探查器(http://memprofiler.com/)

要么

CLR
Profiler(免费)(http://clrprofiler.codeplex.com/)

Java如何获取JSON中某个对象的值

Java如何获取JSON中某个对象的值

Java获取JSON中某个对象的值

public class ChangeJson {
    public static String getString(String data, String result)  {
        JSONObject jsonObject = null;
        try {
            jsonObject = new JSONObject(data);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonObject.optString(result, null);
    }
}

使用方式

现在String result中有如下的JSON串,要取得deptCode

{
  "status": 0,
  "data": {
    "deptId": 76,
    "deptCode": "101030000",
    "deptName": "成都工务段",
    "dirDeptCode": "100000000",
    "deptLevel": 2,
    "defaultRoleId": 1,
    "createAt": "2021-02-25 02:18:51",
    "updateAt": "2021-03-03 09:09:35",
    "defaultRoleName": "系统超级管理员"
  }
}
//获取data
String data = ChangeJson.getString(result, "data");
//获取deptCode
String deptCode= ChangeJson.getString(data , "deptCode");

Java正则表达式-获取json某个属性值

处理数据的时候,要匹配json数据格式的字符串某个属性的值

json数据格式: {"flow_name":"paramName"}

要获取到 flow_name属性的值: paramName

要怎么处理呢?

语法

  • [abc]:表示字母abc中的任意一个
  • \w:除了([0-9a-zA-Z_])还包含了希腊字母,俄文的字母等;
  • \d:匹配数字

数量控制符

  • ? 表示1个或0个。换句话说,表示要不然没有,要不然只有1个
  • + 表示1个或多个

匹配

处理思路:

{"flow_name":"paramName"}

正则表达式怎么写? 匹配的是字符(数字,大小写和下划线的组合)

flow_name 是已知的,要匹配 ":"paramName" 这部分的内容。

String patternStr = keyField+"\":\"([0-9a-zA-Z_]+)?\"";

代码

public static void main(String[] args) {
    String info = "[{\"SYNC_930000003690\":{\"finalSYSTEMNAME\":\"PXY-CPCP配置中心\",\"P_REQUEST_ID\":\"585471439551123454\",\"finalSYSTEMTYPE\":\"BSS-PXY\",\"finalDeveloperName\":\"\",\"finaltaxtCost\":\"\",\"finalworkRemark\":\"\",\"formId\":930000003690,\"REQUEST_ID\":\"A585545039142506496\",\"finalSuplIptDays\":\"22\"}},{\"SYNC_930000003690\":{\"finalSYSTEMNAME\":\"PXY-CPCP配置中心\",\"P_REQUEST_ID\":\"585471439551123455\",\"finalSYSTEMTYPE\":\"BSS-PXY\",\"finalDeveloperName\":\"\",\"finaltaxtCost\":\"\",\"finalworkRemark\":\"\",\"formId\":930000003694,\"REQUEST_ID\":\"B585545039142506496\",\"finalSuplIptDays\":\"44\"}},{\"SYNC_930000003690\":{\"finalSYSTEMNAME\":\"PXY-CPCP配置中心\",\"P_REQUEST_ID\":\"585471439551123456\",\"finalSYSTEMTYPE\":\"BSS-PXY\",\"finalDeveloperName\":\"\",\"finaltaxtCost\":\"\",\"formId\":930000003692,\"finalworkRemark\":\"\",\"REQUEST_ID\":\"C585545039142506496\",\"finalSuplIptDays\":\"55\"}}]";
    String keyField = "P_REQUEST_ID";
    System.out.println("=====    match    "+ keyField + " =========");
    //  \w : 数字,字母 ,下划线 0-9 a-z A-Z _
    String patternStr = keyField+"\":\"([0-9a-zA-Z_]+)?\"";
    matchJsonValue(info,patternStr);
 
    keyField = "formId";
    System.out.println("=====    match    "+ keyField + " =========");
    patternStr = keyField+"\":(\\d+)?";
    matchJsonValue(info,patternStr);
}
 
/**
 * 正则表达式 查找匹配json字符串对应属性的值
 * @param sourcStr 字符串
 * @param patternStr 正则表达式
 * @return 字符集
 */
public static List<String> matchJsonValue(String sourcStr, String patternStr) {
    List<String> aimList = new ArrayList<>();
    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher = pattern.matcher(sourcStr);
    while (matcher.find()) {
        System.out.println("group all: " + matcher.group(0));
        System.out.println("aim index: " + matcher.group(NumberUtils.INTEGER_ONE));
        aimList.add(matcher.group(NumberUtils.INTEGER_ONE));
    }
    return aimList;
}

结果:

=====    match    P_REQUEST_ID =========
group all: P_REQUEST_ID":"585471439551123454"
aim index: 585471439551123454
group all: P_REQUEST_ID":"585471439551123455"
aim index: 585471439551123455
group all: P_REQUEST_ID":"585471439551123456"
aim index: 585471439551123456
=====    match    formId =========
group all: formId":930000003690
aim index: 930000003690
group all: formId":930000003694
aim index: 930000003694
group all: formId":930000003692
aim index: 930000003692

总结:匹配json格式字符串属性的时候,如果使用\w的时候注意下,其可能包含希腊字母,俄文的字母。明确其内容的,直接写更直观。属性是数字的,就不用加双引号了,直接使用\d匹配数字。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • java操作json对象出现StackOverflow错误的问题及解决
  • Java对象和Json文本转换工具类的实现
  • java链式创建json对象的实现
  • Java如何将String转换成json对象或json数组
  • 复杂JSON字符串转换为Java嵌套对象的实现

new一个Object对象占用多少内存?

new一个Object对象占用多少内存?

Java的自动内存管理机制(automatic storage management system known as a garbage collector)省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况。

 

也许很多人都没有考虑过这个问题,new一个Object对象到底占用多少内存呢( Object obj = new Object() )?

 

这里很明确的是obj是一个指向对象的引用(reference - there are three kinds of reference types: class types,array types, and interface types),引用的长度决定了Java的寻址能力,32位的JDK是4字节,64位的JDK是8字节(指针未被压缩的情况下)。

 

因为obj对象没有任何数据(field),会在堆上为它分配空间吗?如果分配空间,里面存储了什么内容?

 

以面向对象的思维来分析,对象封装了数据和行为,是一个统一的整体,虽然obj对象没有数据,但是有行为(Object类定义了12个方法)。当我们执行完new操作后,obj的值为堆内存的地址,既然obj都指向一块内存了,说明是会在堆上为其分配空间的。

 

那么分配的空间有多大,存储了什么内容呢?在The Java Virtual Machine Specification Java SE 7 Edition和The Java Language Specification Java SE 7 Edition里面没有找到相关的描述,这很可能是属于JVM实现自由控制的范畴了。我们可以利用JDK自带的工具jvisualvm.exe来查看分配的空间有多大。为了方便在jvisualvm中查看对象占多少内存,这里使用一个私有的静态内部类EmptyObject来替代Object,因为类定义为空,所以可以等同对待EmptyObject和Object。

 

/**
 * 构造一个无任何字段的空对象占多少内存
 * @author 杨尚川
 */
public class EmptyTest {
    
    public static void main(String[] args) throws InterruptedException{
        //加到集合中,使垃圾无法回收
        List<EmptyObject> emptys = new ArrayList<>();
        for(int i=0;i<100;i++){
            emptys.add(new EmptyObject());
        }
        //打开jvisualvm,查看EmptyObject的大小为16字节
        Thread.sleep(60*1000);
    }
    private static class EmptyObject{}
}

 

 

我们在这里面通过new不同的对象数(for循环次数),来分析内存占用,new 1个对象是16字节,new 2个对象是32字节,new 100个对象是1600字节,通过很多次的尝试,我们从jvisualvm里面可以看到 字节数=对象数*16 ,我们有理由相信对象数跟字节数的线性关系。从这里可以看出,jvisualvm显示的内存占用跟引用的4字节或8字节是没有关系的,也就是说,jvisualvm显示的是堆内存占用,这也很好理解,毕竟所有引用的字节占用是固定的。8字节是引用,16字节是堆内存,总共是8+16=24字节,所以new一个Object对象占用8+16=24字节(64位JDK)

 

如果JDK是32位,按如上分析方法可知new一个Object对象占用4+8=12字节(32位JDK),如下图所示:

 

64位JDK:

32位JDK:

 

 

那么分配的16字节(8字节)的堆内存中存储了什么内容呢?当我们Object obj = new Object();的时候,在栈内存中有一个引用obj,他可能是32位也可能是64位,obj实质只是一个内存地址,那么当我们调用obj.xxx()的时候,JVM怎么知道obj是哪个类的实例呢?所以,可以大胆地推测,obj对象的16字节(8字节)的堆内存中记录了对象属于哪个类的信息,问题是这16字节(8字节)的结构是什么样的?不清楚!

 

不过我们仍然可以大胆地猜测一下,通过上面的64位和32位的堆内存大小对比分析发现,堆内存分配的大小是引用的两倍,上面我们已经猜测堆内存中会记录对象是哪个类的实例,如何记录呢?因为类对象是放置在方法区的,类对象本身也是一个对象,因此可以通过一个引用指向它,所以堆内存有可能就是放置了两个引用,指向两个对象。分析到这里,事情就比较明朗了,堆内存中可能就放置了两个内存地址,一个指向EmptyObject.class(在实验代码中用EmptyObject来代替Object),一个指向什么呢?不清楚!

 

在Inside the Java 2 Virtual Machine 2nd by Bill Venners的5.3.5中有这么一段描述:

 

The Java virtual machine specification is silent on how objects should be represented on the heap. Object representation--an integral aspect of the overall design of the heap and garbage collector--is a decision of implementation designers. 

 

好了,事情最终清楚了,JVM规范并没有规定Java对象在堆中是如何表示的,对象的表示是堆和垃圾收集器的整体设计的一个组成部分,这是由JVM实现的设计师来决定的。 因此,如果我们真的想搞清楚对象是如何表示的,那么需要查询HotSpot VM或是其他JVM实现的相关资料。

 

在淘宝工程师莫枢(撒迦)的《JVM分享》PPT的第112页介绍了“HotSpot中的Java对象布局”,这真是现在关心的内容,通过PPT的介绍说明前面的猜测是对的,如下图所示:



 

 

 

 

 

 

 

我们研究new一个Object对象占多少内存可能没什么实际意义,因为我们在编程的时候就可以确定对象树,基本可以确定对象大小,除了变长字段,当然,变长字段我们一般也会有长度限制。所以我们真正关心的是所有数据最终的大小,也就是数据库的大小。

 

面向对象的分析、设计和编程都把“封装”奉为圭臬,“分层”更是架构设计中至关重要的设计准则。因为只有这样,才能实现基本的解耦、让协作分工成为可能,满足工业要求的最大化生产力的最终目标。

 

那么这种没有什么实际意义的问题为什么要研究呢?我觉得只能用三个字来形容:好奇心好奇心是驱使我们研究技术的强大推力,当我们工作了很多年,尤其是在不重视技术的公司,我们对技术还有激情吗?保持一颗敏感好奇的心,也许技术之路可以走的更长更远。

 

这篇文章的重点是展示一种分析问题的思路,要大胆猜测,小心求证,追本溯源,引经据典。求证方式:查找标准规范、查找经典权威书籍、自己做实验、查找源代码等。

 

参考资料:

1、Java™ Virtual Machine Technology

2、The Java Virtual Machine Specification Java SE 7 Edition

3、The Java Language Specification Java SE 7 Edition

4、Inside the Java 2 Virtual Machine 2nd by Bill Venners

5、JVM分享

6、http://www.javamex.com/classmexer/

今天关于找出Python中某个对象正在使用多少内存[python找出只出现一次的元素的介绍到此结束,谢谢您的阅读,有关C#/NET对象使用多少内存?、C#/。NET对象使用多少内存?、Java如何获取JSON中某个对象的值、new一个Object对象占用多少内存?等更多相关知识的信息可以在本站进行查询。

本文标签: