最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存?
在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用:
import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.Set; /** * 对象占用字节大小工具类 * */ public class SizeOfObject { static Instrumentation inst; public static void premain(String args, Instrumentation instP) { inst = instP; } /** * 直接计算当前对象占用空间大小,包括当前类及超类的基本类型实例字段大小、 * 引用类型实例字段引用大小、实例基本类型数组总占用空间、实例引用类型数组引用本身占用空间大小; * 但是不包括超类继承下来的和当前类声明的实例引用字段的对象本身的大小、实例引用数组引用的对象本身的大小 * * @param obj * @return */ public static long sizeOf(Object obj) { return inst.getObjectSize(obj); } /** * 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小 * * @param objP * @return * @throws IllegalAccessException */ public static long fullSizeOf(Object objP) throws IllegalAccessException { Set visited = new HashSet(); Deque toBeQueue = new ArrayDeque(); toBeQueue.add(objP); long size = 0L; while (toBeQueue.size() > 0) { Object obj = toBeQueue.poll(); //sizeOf的时候已经计基本类型和引用的长度,包括数组 size += skipObject(visited, obj) ? 0L : sizeOf(obj); Class tmpObjClass = obj.getClass(); if (tmpObjClass.isArray()) { //[I , [F 基本类型名字长度是2 if (tmpObjClass.getName().length() > 2) { for (int i = 0, len = Array.getLength(obj); i < len; i++) { Object tmp = Array.get(obj, i); if (tmp != null) { //非基本类型需要深度遍历其对象 toBeQueue.add(Array.get(obj, i)); } } } } else { while (tmpObjClass != null) { Field[] fields = tmpObjClass.getDeclaredFields(); for (Field field : fields) { if (Modifier.isStatic(field.getModifiers()) //静态不计 || field.getType().isPrimitive()) { //基本类型不重复计 continue; } field.setAccessible(true); Object fieldValue = field.get(obj); if (fieldValue == null) { continue; } toBeQueue.add(fieldValue); } tmpObjClass = tmpObjClass.getSuperclass(); } } } return size; } /** * String.intern的对象不计;计算过的不计,也避免死循环 * * @param visited * @param obj * @return */ static boolean skipObject(Set visited, Object obj) { if (obj instanceof String && obj == ((String) obj).intern()) { return true; } return visited.contains(obj); } } 大家可以用这个代码边看边验证,注意的是,运行这个程序需要通过javaagent注入Instrumentation,具体可以看原博客。我今天主要是总结下手动计算Java对象占用字节数的基本规则,做为基本的技能必须get√,希望能帮到和我一样的Java菜鸟。 在介绍之前,简单回顾下,Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。另外:不同的环境结果可能有差异,我所在的环境是HotSpot虚拟机,64位Windwos。 下面进入正文: 对象头 对象头在32位系统上占用8bytes,64位系统上占用16bytes。 实例数据 原生类型(primitive type)的内存占用如下: Primitive Type Memory Required(bytes) boolean 在数组中占1个字节,单独使用时占4个字节 byte 1 short 2 char 2 int 4 float 4 long 8 double 8 reference类型在32位系统上每个占用4bytes, 在64位系统上每个占用8bytes。 关于boolean内存占用 https://www.cnblogs.com/wangtianze/p/6690665.html?utm_source=itdadao&utm_medium=referral 对齐填充 HotSpot的对齐方式为8字节对齐: (对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8 指针压缩 对象占用的内存大小收到VM参数UseCompressedOops的影响。32G内存以下的,默认开启对象指针压缩。 1)对对象头的影响 开启(-XX:+UseCompressedOops)对象头大小为12bytes(64位机器)。 static class A { int a; } A对象占用内存情况: 关闭指针压缩: 16(对象头)+4(实例数据)=20不是8的倍数,因此需要对齐填充 16+4+4(padding)=24 开启指针压缩: 12+4=16已经是8的倍数了,不需要再padding。 1) 对reference类型的影响 64位机器上reference类型占用8个字节,开启指针压缩后占用4个字节。 static class B2 { int b2a; Integer b2b; } B2对象占用内存情况: 关闭指针压缩: 16+4+8=28不是8的倍数,需要对齐填充 16+4+8+4(padding)=32 开启指针压缩: 12+4+4=20不是8的倍数,需要对齐填充12+4+4+4(padding)=24 数组对象 64位机器上,数组对象的对象头占用24个字节(8字节MarkWord+8字节类型指针+8字节数组长度),启用压缩之后占用16个字节(8字节MarkWord+4字节类型指针+4字节数组长度)。之所以比普通对象占用内存多是因为需要额外的对象头空间存储数组的长度。 先考虑下new Integer[0]占用的内存大小,数组长度为0,所以所占用的大小就是对象头的大小: 未开启压缩:24bytes 开启压缩后:16bytes 接着计算new Integer[1],new Integer[2],new Integer[3]和new Integer[4]就很容易了: 未开启压缩: 开启压缩: 拿new Integer[3]来具体解释下: 未开启压缩:24(对象头)+ 8*3 = 48,不需要padding; 开启压缩:16(对象头)+ 4*3 = 28,需要对齐填充 28 + 4(padding) = 32,其他依次类推。 自定义类的数组也是一样的,比如: static class B3 { int a; Integer b; } new B3[3]占用的内存大小: 未开启压缩:24(对象头)+ 8*3 = 48 开启压缩后:16(对象头)+ 4*3 + 4(padding) = 32 复合对象 计算复合对象占用内存的大小其实就是运用上面几条规则,只是麻烦点。 1)对象本身的大小 直接计算当前对象占用空间大小,包括当前类及超类的基本类型实例字段大小、引用类型实例字段引用大小、实例基本类型数组总占用空间、实例引用类型数组引用本身占用空间大小; 但是不包括超类继承下来的和当前类声明的实例引用字段的对象本身的大小、实例引用数组引用的对象本身的大小。 static class B { int a; int b; } static class C { int ba; B[] as = new B[3]; C() { for (int i = 0; i < as.length; i++) { as[i] = new B(); } } } 计算C对象的大小: 未开启压缩:16(对象头)+ 4(ba)+ 8(as引用的大小)+ 4(padding) = 32 开启压缩:12(对象头)+ 4(ba)+4(as引用的大小)+ 4(padding) = 24 2)当前对象占用的空间总大小 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小。 递归计算复合对象占用的内存的时候需要注意的是:对齐填充是以每个对象为单位进行的,看下面这个图就很容易明白。 现在我们来手动计算下C对象占用的全部内存是多少,主要是三部分构成:C对象本身的大小+数组对象的大小+B对象的大小。 未开启压缩: (16 + 4 + 8+4(padding)) + (24+ 8*3) +(16+4+4)*3 = 152bytes 开启压缩: (12 + 4 + 4 +4(padding)) + (16 + 4*3 +4(数组对象padding)) + (12+4+4+4(B对象padding)) *3= 128bytes 继承关系 涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员, 父类也要按照 8 byte 规定 public static class D { byte d1; } public static class E extends D { byte e1; } 计算E对象的大小: 未开启压缩:16(对象头) + 父类(1(d1) + 7(padding)) + 1(e1) + 7(padding) = 32 开启压缩:12(对象头) + 父类(1(d1) + 7(padding)) + 1(e1) + 3(padding) = 24 大家有兴趣的可以试试。 实际工作中真正需要手动计算对象大小的场景应该很少,但是个人觉得做为基础知识每个Java开发人员都应该了解,另外:对自己写的代码大概占用多少内存,内存中是怎么布局的应该有一个直觉性的认识。 你可能感兴趣的:(Java,JVM) 面试题——Java中的锁 m0_67265654 面试学习路线阿里巴巴javajavascript开发语言 文章目录谈谈你对线程安全的理解?1、synchronized关键字是怎么用的?1.1构造方法可以使用synchronized关键字修饰么?1.2使用String作为锁对象,会有什么问题?1.3synchronized的底层原理有了解吗?1.4synchronized怎么保证可重入性?可见性?抛异常怎么办?1.4还使用过其他锁吗?(ReentrantLock)1.5ReentrantLock的实现原 【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统 小咕聊编程 springbootvue.js学习 项目介绍本课程演示的是一款基于SpringBoot和Vue的编程学习系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项目附带的源码资料可作为毕设使用该SpringBoot+Vue的编程学习系统,后端采用SpringBoot架构,前端采用Vue+ElementUI实现页 Hive Exception: Too many counters: 2001 max=2000 的解决方法 houzhizhen hivehivehadoopbigdata 在hive任务的执行过程中,可能出现Toomanycounters的异常。如果执行引擎时tez,则说明当前作业的counters数量超过tez默认的counters限制。Exception:Toomanycounters:2001max=2000atorg.apache.tez.common.counters.Limits.checkCounters(Limits.java:88)atorg.ap 2024华为OD机试真题-数据分类算法(C++/Java/Python)-E卷-100分 2024剑指offer 华为odc++pythonjava 2024华为OD机试最新E卷题库-(C卷+D卷+E卷)-(JAVA、Python、C++)目录题目描述输入描述输出描述用例1用例2题目解析考点代码c++pythonJava题目描述对一个数据a进行分类,分类方法为:此数据a(四个字节大小)的四个字节相加对一个给定的值b取模如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值如果得到的结果大于或者等于c,则数据a为无效类型比如一个数 IDEA入门及常用快捷键 tyrolin intellij-ideajavaide IDEA是java常用的IDE。当run一个.java文件时,其实是经历了先编译为.class,再运行的过程。在project文件夹中,out文件夹存储编译的.class文件,src文件夹存储.java代码文件。设置自动导包快捷键:格式化快捷键:Control+alt+L生成构造器,右键generate,constructor光标点到类,查看类的层级关系,ctrl+H光标点到方法,定位到方法,ct 2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中... 耀耀zz 2025最新华为OD机试题目华为od算法 摘要本专栏提供2025最新最全的华为OD机试真题库(E+A+B+C+D卷),包括100分和200分题型。题目包含题目描述、输入描述、用例、备注和解题思路、多种语言解法(Java/JS/Py/C/C++)。希望小伙伴们认真学习、顺利通过。声明本专栏的文章主要包括两部分:第一部分:题目描述、输入描述、用例。第二部分:解题思路、源码。第一部分信息来自互联网,不是本专栏付费内容,如果这一部分内容侵犯了原著 Java RPC(远程过程调用)技术详解 黄尚圈圈 javarpc开发语言 在当今分布式系统盛行的时代,服务间的通信变得至关重要。JavaRPC(RemoteProcedureCall,远程过程调用)作为一种高效、透明的远程通信手段,在微服务架构、分布式计算等领域扮演着重要角色。本文将深入介绍JavaRPC的基本概念、工作原理、实现方式以及实际应用中的注意事项。一、JavaRPC概述RPC允许一个程序直接调用另一个地址空间(通常是另一台机器上的程序)中的过程或函数,就像调 工资和奖金(acwing)c/c++/java/python xinghuitunan c++c语言javapython 请你编写一个程序,给定你一个销售人员的名字,底薪以及月销售额。请你计算他的月收入是多少。已知月收入等于底薪加15%15%的月销售额。所有数据保留两位小数。输入格式输入第一行包含一个由大写字母构成的长度不超过1010的字符串,表示销售人员的名字。第二行包含一个浮点数,表示该人员的底薪。第三行包含一个浮点数,表示该人员的月销售额。输出格式输出格式为TOTAL=R$X,XX为该人员月收入。数据范围0≤底 js基础二 才不是小emo的小杨 前端爬虫javascript前端html JavaScript基础下1事件处理JS事件(event)是当用户与网页进行交互时发生的事情,例如单机某个链接或按钮、在文本框中输入文本、按下键盘上的某个按键、移动鼠标等等。当事件发生时,您可以使用JavaScript中的事件处理程序(也可称为事件监听器)来检测并执行某些特定的程序。一般情况下事件的名称都是以单词on开头的,例如点击事件onclick、页面加载事件onload等。下表中列举了一些J JavaEE线程安全的单例模式两种典型的实现 sugar high Java单例模式java开发语言 1.饿汉模式饿汉模式的单例模式是比较着急的去进行创建实例的,static修饰的成员更准确的应该叫做类成员,一个Java程序中,一个类对象只存在一份进一步保证了static成员只有一份。饿汉模式中getInstance仅是读取了变量的内容,如果多个线程只是读同一个变量不修改,此时仍然是线程安全的。classSingleton{//1.使用static创建一个实例并立即进行初始化//这个instanc 【Java】网络通信IO模型 茉菇 java开发语言 Java网络编程中的IO(Input/Output)模型是管理计算机对外部数据读取和写入操作的重要机制。Java提供了多种IO模型来满足不同的网络通信需求。一、阻塞IO(BIO,BlockingI/O)概念:阻塞IO是最简单和直观的一种IO模型。在BIO模型中,当用户线程发起系统调用时,内核会一直等待,直到有数据可读或可写,才会返回结果。特点:同步阻塞:服务器实现模式为一个连接一个线程,即客户端有 SpringBoot整合DeepSeek技术指南(2025版) hjy1821 AI人工智能 SpringBoot整合DeepSeek技术指南(2025版)环境准备com.deepseekdeepseek-java-sdk2.5.0org.springframework.bootspring-boot-starter-webflux配置中心设置#application.ymldeepseek:api:base-url:https://api.deepseek.com/v2token:${D Oracle 数据库基础入门(五):限制查询与范式三约定深度解析 Aphelios380 Oracle数据库oracle学习java 在Oracle数据库的学习进程中,限制查询与范式三约定是两个极为重要的概念。限制查询帮助我们精准获取特定范围的数据,而范式三约定则为数据库设计提供了科学的指导框架。对于Java全栈开发者而言,掌握这些知识不仅有助于高效地从数据库中提取数据,更能设计出结构合理、性能优良的数据库,为构建强大的应用系统奠定坚实基础。目录一、Oracle限制查询(一)与MySQL限制查询的对比(二)伪列的奥秘(三)限制查 7-11 sdut-String-5 图书价格汇总(II) (10 分) 灯火穿透了 PTAJava题java 假设图书馆中图书信息的格式为:Java程序设计:34;Web程序设计:56;JSP程序设计:20按要求输出每本图书的名称及价格,计算所有图书的总价格并输出。输入格式:读入一行图书信息。如:Java程序设计:34;Web程序设计:56;JSP程序设计:20提示:每本书的价格是整数,价格与下一本书的名字之间有一个中文;价格前可能有空格,可能没有。输出格式:分别输出每本图书的名称及价格,一本书占一行,形 三、Jvm内存分配 刘总Java Java虚拟机jvmjava开发语言 今天的博客主题Java虚拟机——》Jvm内存分配什么是JVM内存分配呢?就是当我们创建一个对象的时候,要在JVM内存空间里为这个对象分配一些空间,来存放对象的一些属性信息。对象创建的流程1)类加载检查在创建对象的过程中,也就是new一个对象的时候。首先检查new指令的参数在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载,解析和初始化过。如有没有,说明这个类没有被加载使用过 Java生成LRC纵向冗余校验 YunFeiDong Javajava开发语言ModbusASCII 纵向冗余校验(LongitudinalRedundancyCheck,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验;它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法;通常Modbus协议ASCII模式采用LRC算法。1.生成LRC校验/***生成LRC校验值:**1)对需要校验的数据(2n个字符)两两组成一个16进制的数值求和;*2)将求和结果与256求模;*3)用 Java基础之JVM对象内存分配机制简介 aoneword JVM基础jvmjava开发语言 一对象内存分配1.1运行时数据区域1.2常见java应用启动JVM参数:-Xss:每个线程的栈大小(单位kb)-Xms:堆的初始大小,默认物理内存的1/64,示例:-Xms:4g-Xms:10m-Xmx:堆的最大可用大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewRatio:默认2,表示新生代占老年代的1/2,占整个堆内存的1/3-XX:SurvivorRatio:默认8,表示一个su python文件修改后不生效_pycharm修改代码后第一次运行不生效解决 weixin_39959126 python文件修改后不生效 SVN搭建简单教程一.引言笔者曾经试图在网上搜索一篇关于SVN源代码服务器搭建方面的中文技术文章,可惜,所找到的,要么是不完整,要么就是对笔者没什么帮助的文章,TortoiseSvn的帮助文档固然强大,但因为是英文,...java零碎知识点1.字符串有整型的相互转换12Stringa=String.valueOf(2);//integertonumericstringinti=Integer.pa react 基础 理想和远方_在路上 react.jsjsx 一.什么是react?react是一种用于构建用户界面的javaScript库react主要用来写html,或构建web应用如果用mvc的角度来看,react仅仅是视图层(v),也就是只负责视图的渲染,并不是提供了完成的M和C的功能。二.react的特点1.声明式只需要描述html看起来是什么样,就跟写html一样。react负责渲染UI,并在数据变化是更新UI。constjsx=HelloRea java excel 导入 加校验_Java通过POI为Excel添加数据验证 夏至未至 javaexcel导入加校验 Stringpath="d:\\success.xlsx";StringsheetName="sheetlist";XSSFWorkbookwb=null;XSSFSheetsheetlist=null;FileinputFile=newFile(path);if(inputFile.exists()){wb=newXSSFWorkbook(newFileInputStream(path));}e SpringAI赋能Java开发打造智能应用 java技术小馆 javaAI编程 一、SpringAI是什么?为什么你需要它?想象一下,你的Java应用能够:理解自然语言自动生成代码智能分析数据提供个性化推荐这就是SpringAI带来的变革!它是Spring官方推出的AI集成框架,让你的Java应用轻松获得AI能力。传统开发vsSpringAI开发对比:能力传统开发SpringAI开发自然语言处理需要集成第三方SDK开箱即用开发效率手动实现复杂逻辑自动生成代码维护成本高低可扩展 IDEA编写JAVA的常用快捷键 峥嵘轻稠 intellij-ideajavaintellijidea (摘要:这是我平常使用IDEA的快捷键,希望能帮到和我一样刚入门的小白~~创作不易,希望能得到点赞关注支持嘿嘿嘿~~~)Ctrl+A:全选Ctrl+Z:撤销Ctrl+X:剪切Ctrl+C:复制Ctrl+V:粘贴Ctrl+Y:删除当前行Ctrl+D:复制当前行到下一行Ctrl+O:选择可重写的方法Ctrl+I:重写接口方法Ctrl+/:快速单行注释Ctrl+Shift+/:快速多行注释Ctrl+Al JAVA学习——DAY1 E卤蛋 JAVA学习java 几个cmd终端命令:cls——清屏cd——移至所在路径,后跟绝对路径or相对路径ip-config——查看本机ip信息java开发环境:JDK——java开发环境,包含:JRE(Java运行时环境),JVM(java虚拟机),以及各类开发库文件;安装目录:bin目录:两个重要——javac.exe(java编译工具),从.java文件编译为.class(字节码文件),java.exe(Java运行 JVM两种内存分配方式 小白,想脱白 jvm 1、指针碰撞如果jvm内存是规整的,就是一边是已使用的内存,另外一边是未使用的内存,中间是指针,jvm需要给新对象分配内存时,就会将指针往未使用的内存移动一段和新对象一样大小的距离,这样jvm就完成了内存分配。2、空闲列表如果jvm内存不是规整的,已使用的,未使用的内存,都是杂乱无章的,这个时候就不可能使用指针碰撞,Java虚拟机就会维护一个空闲列表,用来记录哪些内存是可用的,然后jvm给新对象分 深度解析JVM世界:JVM内存分配 最后一支迷迭香 jvm虚拟机jvmjavajvm内存 本篇文章的主要内容是介绍JVM内存的分配方式、JVM内存的快速分配策略、JVM的逃逸分析和堆内存的分代思想几部分内容。请同学们认真听讲,面试会问到。。。1.内存分配大家需要注意不分配内存的对象无法进行其他操作JVM为对象分配内存的过程:首先计算对象占用空间大小,接着在堆中划分一块内存给新对象主要方式分为以下两种:如果内存规整,使用指针碰撞(BumpThePointer)。所有用过的内存在一边,空闲 JAVA多线程详解(超详细) m0_74823434 面试学习路线阿里巴巴资料职业发展javapython开发语言后端 目录一、线程简介1、进程、线程2、并发、并行、串行3、进程的三态二、线程实现1、继承Thread类2、实现Runnable接口3、实现Callable接口(不常用)三、线程常用方法1、线程的状态2、线程常用方法四、多线程1、守护(Deamon)线程2、多线程并发与同步3、死锁4、Lock(锁)5、线程协作6、线程池一、线程简介1、进程、线程程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和 JMeter 不同协议测试最佳实践汇总 那片海还在吗 testjmeter测试工具 JMeter不同协议测试最佳实践汇总一、JMeter测试HTTPS(一)环境准备JMeter安装:从JMeter官方网站下载并解压JMeter到本地。Java环境:确保系统已安装Java运行环境(JRE)或开发环境(JDK),建议使用Java8及以上版本。(二)创建测试计划启动JMeter,默认有一个测试计划。右键点击测试计划,选择“添加”->“线程(用户)”->“线程组”,可设置线程数、循环次数 【React全解】React起手式 caihuayuan4 面试题汇总与解析springsqljava大数据 如何引入React从bootcdn引入React按顺序引入React然后引入ReactDOMCommonJSVSUMD规范JavaScript的模块定义和加载机制,降低了学习和使用各种框架的门槛,能够以一种统一的方式去定义和使用模块,提高开发效率,降低了应用维护成本CommonJSCommonJS是一种规范,NodeJS是这种规范的实现CommonJS模块是对象,是运行时加载,运行时才把模块挂载在 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 caihuayuan4 面试题汇总与解析springsqljava大数据课程设计 com.mysql.jdbc.Driver是mysql-connector-java5中的com.mysql.cj.jdbc.Driver是mysql-connector-java6中的所以在使用的时候一定要注意版本com.mysql.jdbc.DriverdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/te Java学习——day14 blackA_ java学习开发语言 文章目录1.项目需求分析2.项目设计3.代码分析4.运行示例5.今日学习总结6.今日生词今日学习计划1.项目需求分析功能要求:(1)存储学生信息:使用HashMap存储学生信息(学号作为键,Student对象作为值)。(2)操作学生数据:添加学生(姓名、学号、成绩)。删除学生(按学号删除)。查询学生(按学号查询)。显示所有学生信息。(3)异常处理:防止重复添加(如果学号已存在,抛出异常)。查询/删 SAX解析xml文件 小猪猪08 xml 1.创建SAXParserFactory实例 2.通过SAXParserFactory对象获取SAXParser实例 3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类 4.SAXParser实例的parse来获取文件 public static void main(String[] args) { // 为什么mysql里的ibdata1文件不断的增长? brotherlamp linuxlinux运维linux资料linux视频linux运维自学 我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。 当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。 一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是: ibdata1存了什么? 当你启用了 i Quartz-quartz.properties配置 eksliang quartz 其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。 下面是这些默认值的解释 #-----集群的配置 org.quartz.scheduler.instanceName = informatica session的使用 18289753290 workflowsessionlogInformatica 如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20 session下面的source 里面有个tracing Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误 酷的飞上天空 scrapy Scrapy版本0.14.4 出现问题现象: ERROR: Error downloading <GET http://xxxxx CRC check failed 解决方法 1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0' 明确表示不支持任何形式的压缩格式,避免程序的解压 java Swing小集锦 永夜-极光 java swing 1.关闭窗体弹出确认对话框 1.1 this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE); 1.2 this.addWindowListener ( new WindowAdapter () { public void windo 强制删除.svn文件夹 随便小屋 java 在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除 GET和POST有什么区别?及为什么网上的多数答案都是错的。 aijuans get post 如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。 这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G 谈谈新浪微博背后的那些算法 aoyouzi 谈谈新浪微博背后的那些算法 本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。 微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针 Connection reset 连接被重置的解决方法 百合不是茶 java字符流连接被重置 流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置 被重置的代码如下; 客户端代码; package 通信软件服务器; import java.io.BufferedWriter; import java.io.OutputStream; import java.io.O web.xml配置详解之filter bijian1013 javaweb.xmlfilter 一.定义 <filter> <filter-name>encodingfilter</filter-name> <filter-class>com.my.app.EncodingFilter</filter-class> <init-param> <param-name>encoding< Heritrix Bill_chen 多线程xml算法制造配置管理 作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。 Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资 【Zookeeper】FAQ bit1129 zookeeper 1.脱离IDE,运行简单的Java客户端程序 #ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient 1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码 2. 如果Zookeeper集群跨越多个机房,那么Leader/ The user specified as a definer ('aaa'@'localhost') does not exist 白糖_ localhost 今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist 最后找原因发现删除操作做了触发器,而触发器里面有这样一句 /*!50017 DEFINER = ''aaa@'localhost' */ 原来最初 javascript中showModelDialog刷新父页面 bozch JavaScript刷新父页面showModalDialog 在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行: window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self 在子页面使用w 编程之美-买书折扣 bylijinnan 编程之美 import java.util.Arrays; public class BookDiscount { /**编程之美 买书折扣 书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。 下面用动态规划实现。 哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷 关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要 chenbowen00 strutsWEB安全 因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。 下面记录下本次解决的过程以便后续 1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议, 而使用ftp协议默认会产生一个匿名用 [电力与暖气]煤炭燃烧与电力加温 comsci 在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区..... 不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢? &nbs oracle O7_DICTIONARY_ACCESSIBILITY参数 daizj oracle O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL 比较全面的MySQL优化参考 dengkane mysql 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。 1、硬件层相关优化 1.1、CPU相关 在服务器的BIOS设置中,可 C语言homework2,有一个逆序打印数字的小算法 dcj3sjt126com c #h1# 0、完成课堂例子 1、将一个四位数逆序打印 1234 ==> 4321 实现方法一: # include <stdio.h> int main(void) { int i = 1234; int one = i%10; int two = i / 10 % 10; int three = i / 100 % 10; apacheBench对网站进行压力测试 dcj3sjt126com apachebench ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。 通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。 2种办法让HashMap线程安全 flyfoxs javajdkjni 多线程之--2种办法让HashMap线程安全 多线程之--synchronized 和reentrantlock的优缺点 多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync) HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全. Spring Security(04)——认证简介 234390216 Spring Security认证过程 认证简介 目录 1.1 认证过程 1.2 Web应用的认证过程 1.2.1 ExceptionTranslationFilter 1.2.2 在request之间共享SecurityContext 1 Java 位运算 Javahuhui java位运算 // 左移( << ) 低位补0 // 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0: // 0000 0000 0000 0000 0000 0000 0001 1000 System.out.println(6 << 2);// 运行结果是24 // 右移( >> ) 高位补" mysql免安装版配置 ldzyz007 mysql 1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。 2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。 3、my-large.ini是为专用于一个SQL数据 MFC和ado数据库使用时遇到的问题 你不认识的休道人 sqlC++mfc =================================================================== 第一个 =================================================================== try{ CString sql; sql.Format("select * from p 表单重复提交Double Submits rensanning double 可能发生的场景: *多次点击提交按钮 *刷新页面 *点击浏览器回退按钮 *直接访问收藏夹中的地址 *重复发送HTTP请求(Ajax) (1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。 这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法: http://getbootstrap.co Java String 十大常见问题 tomcat_oracle java正则表达式 1.字符串比较,使用“==”还是equals()? "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。 equals()判断两个字符串的值是否相等。 除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。 如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。 SpringMVC 登陆拦截器实现登陆控制 xp9802 springMVC 思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。 实现方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 按字母分类: ABCDEFGHIJKLMNOPQRSTUVWXYZ其他
大家可以用这个代码边看边验证,注意的是,运行这个程序需要通过javaagent注入Instrumentation,具体可以看原博客。我今天主要是总结下手动计算Java对象占用字节数的基本规则,做为基本的技能必须get√,希望能帮到和我一样的Java菜鸟。
在介绍之前,简单回顾下,Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。另外:不同的环境结果可能有差异,我所在的环境是HotSpot虚拟机,64位Windwos。
下面进入正文:
对象头在32位系统上占用8bytes,64位系统上占用16bytes。
原生类型(primitive type)的内存占用如下:
reference类型在32位系统上每个占用4bytes, 在64位系统上每个占用8bytes。
关于boolean内存占用 https://www.cnblogs.com/wangtianze/p/6690665.html?utm_source=itdadao&utm_medium=referral
HotSpot的对齐方式为8字节对齐:
(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8
对象占用的内存大小收到VM参数UseCompressedOops的影响。32G内存以下的,默认开启对象指针压缩。
开启(-XX:+UseCompressedOops)对象头大小为12bytes(64位机器)。
static class A { int a; }
A对象占用内存情况:
关闭指针压缩: 16(对象头)+4(实例数据)=20不是8的倍数,因此需要对齐填充 16+4+4(padding)=24
开启指针压缩: 12+4=16已经是8的倍数了,不需要再padding。
64位机器上reference类型占用8个字节,开启指针压缩后占用4个字节。
static class B2 { int b2a; Integer b2b; }
B2对象占用内存情况:
关闭指针压缩: 16+4+8=28不是8的倍数,需要对齐填充 16+4+8+4(padding)=32
开启指针压缩: 12+4+4=20不是8的倍数,需要对齐填充12+4+4+4(padding)=24
64位机器上,数组对象的对象头占用24个字节(8字节MarkWord+8字节类型指针+8字节数组长度),启用压缩之后占用16个字节(8字节MarkWord+4字节类型指针+4字节数组长度)。之所以比普通对象占用内存多是因为需要额外的对象头空间存储数组的长度。
先考虑下new Integer[0]占用的内存大小,数组长度为0,所以所占用的大小就是对象头的大小:
未开启压缩:24bytes
开启压缩后:16bytes
接着计算new Integer[1],new Integer[2],new Integer[3]和new Integer[4]就很容易了:
未开启压缩:
开启压缩:
拿new Integer[3]来具体解释下:
未开启压缩:24(对象头)+ 8*3 = 48,不需要padding;
开启压缩:16(对象头)+ 4*3 = 28,需要对齐填充 28 + 4(padding) = 32,其他依次类推。
自定义类的数组也是一样的,比如:
static class B3 { int a; Integer b; }
new B3[3]占用的内存大小:
未开启压缩:24(对象头)+ 8*3 = 48
开启压缩后:16(对象头)+ 4*3 + 4(padding) = 32
计算复合对象占用内存的大小其实就是运用上面几条规则,只是麻烦点。
直接计算当前对象占用空间大小,包括当前类及超类的基本类型实例字段大小、引用类型实例字段引用大小、实例基本类型数组总占用空间、实例引用类型数组引用本身占用空间大小; 但是不包括超类继承下来的和当前类声明的实例引用字段的对象本身的大小、实例引用数组引用的对象本身的大小。
static class B { int a; int b; } static class C { int ba; B[] as = new B[3]; C() { for (int i = 0; i < as.length; i++) { as[i] = new B(); } } }
计算C对象的大小:
未开启压缩:16(对象头)+ 4(ba)+ 8(as引用的大小)+ 4(padding) = 32
开启压缩:12(对象头)+ 4(ba)+4(as引用的大小)+ 4(padding) = 24
递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小。
递归计算复合对象占用的内存的时候需要注意的是:对齐填充是以每个对象为单位进行的,看下面这个图就很容易明白。
现在我们来手动计算下C对象占用的全部内存是多少,主要是三部分构成:C对象本身的大小+数组对象的大小+B对象的大小。
(16 + 4 + 8+4(padding)) + (24+ 8*3) +(16+4+4)*3 = 152bytes
(12 + 4 + 4 +4(padding)) + (16 + 4*3 +4(数组对象padding)) + (12+4+4+4(B对象padding)) *3= 128bytes
涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员, 父类也要按照 8 byte 规定
public static class D { byte d1; } public static class E extends D { byte e1; }
计算E对象的大小:
未开启压缩:16(对象头) + 父类(1(d1) + 7(padding)) + 1(e1) + 7(padding) = 32
开启压缩:12(对象头) + 父类(1(d1) + 7(padding)) + 1(e1) + 3(padding) = 24
大家有兴趣的可以试试。
实际工作中真正需要手动计算对象大小的场景应该很少,但是个人觉得做为基础知识每个Java开发人员都应该了解,另外:对自己写的代码大概占用多少内存,内存中是怎么布局的应该有一个直觉性的认识。