最近在读《深入理解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) 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)异常处理:防止重复添加(如果学号已存在,抛出异常)。查询/删 mac idea配置了八百次maven都不成功,mac source不生效 source ~/.bash_profile Alisa_wu666 ideamavensourcemaven 终端输入open~/.bash_profile,检查内容:exportPATH=/usr/bin:/usr/sbin:/bin:/sbinexportJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/HomeexportM2_HOME=/Users/nanwu/mooc/apache-maven-3.5.3e 后端java的复习-常用API(个人笔记) 狴犴ys java基础后端技术栈巩固复习java 常用apiObjecttoString方法equals方法finalize方法clone()方法SystemString构造方法常用方法获取型判断型转换型StringBuffer与StringBuilder八种基本数据类型包装类八种包装类IntegerDate获取系统当前时间Date->StringString->DateCalendar(日历)介绍常用方法匿名内部类ObjecttoString方 Kotlin/Java 实现 Html 转图片 zimoyin javakotlinhtml 1.Html2Imagegui.avahtml2image2.0.1StringHtmlTemplateStr="....";//HTMLHtmlParserhtmlParser=newHtmlParserImpl();htmlParser.loadHtml(HtmlTemplateStr);ImageRendererimageRenderer=newImageRendererImpl(htmlP jQuery获取并解析API接口Json数据的方法 qhdzj87 前端(JSjQuery等)jqueryjsonjavascript json是API的常用数据交换格式,在Web开发中,除了后端程序,前端也可以借助JavaScript技术获取并解析API中的json数据,这里介绍一种通过jQuery的$get()函数获取并解析API接口Json数据的方法。其基本语法如下:$get(url,[data],[callback])在$get()函数中,包含了三个参数。其中:url:请求的地址;data:请求数据的列表;callback 如何设置HTTP请求中的参数? 数据小爬虫@ http网络协议网络 在Java中设置HTTP请求的参数是爬虫开发中的一个常见任务。这可以通过多种方式实现,具体取决于你使用的库。以下将展示如何使用ApacheHttpClient和Java11+的HttpClient设置HTTP请求中的参数。一、使用ApacheHttpClient设置请求参数(一)添加依赖如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:org.apache.httpcomponen 如何使用Java爬虫处理API接口返回的JSON数据? 小爬虫程序猿 APIjavajson开发语言 处理API接口返回的JSON数据是Java爬虫开发中的一个常见任务。在Java中,有多个库可以帮助我们解析JSON数据,其中最流行的是Jackson和Gson。以下是使用这两个库处理JSON数据的基本步骤和示例代码。使用Jackson处理JSONJackson是一个功能强大的JSON处理库,它不仅可以将JSON字符串解析为Java对象,还可以将Java对象转换为JSON字符串。添加Jackson依 网络原理 初识[Java EE] 猿周LV JavaEE网络原理网络java-eejava 目录网络发展史独立模式网络互联局域网LAN1.基于网络直连2.基于集线器(Hub)组建3.基于交换机(Switch)组建4.基于交换机和路由器(Router)组建广域网WAN网络通信基础IP地址1.概念2.格式端口号1.概念2.格式认识协议1.概念2.作用3.协议分层3.1什么是协议分层3.2分层的作用3.2.1上层不需要了解下层的细节(封装)3.2.2灵活的调整/替换某层的协议4.五元组4.1源 C++ vector::push_back和Java List.add的区别 da_kao_la JavaCppJavaCppvectorList C++vector::push_back和JavaList.add的区别对象赋值C++和Java在对象赋值方面区别较大,归根到底,还是因为C++和Java中对象存储和引用方式不同。C++中静态建立(即Objobj)的对象的内容(类属性)是存储在栈上的,变量obj直接持有对象本身;Java中建立的对象(Objobj=newObj())的内容(类属性)是存储在堆上的,位于栈上的变量obj只是持有对象的 java学习.五 羽沢31 学习 目录一、本周学习内容:二、学习笔记:(1)Map集合1.Map集合的初步认识:2.Map集合的特点和常用方法3.Map集合的遍历4.Map集合的底层原理(2)Collections工具类1.Collections的常用方法三、编程练习(1)数组练习1.矩阵顺时针打印2.矩阵查找某个值(快捷法)(2)StringJoiner练习1.练习(3)集合统一练习1.扑克牌的洗牌、发牌(无排序)2.统计80个 【用java在控制台实现简单的图书管理系统】 A boy CDEF girl java开发语言 用java在控制台实现简单的图书管理系统book包Book类BookList类user包User类AdmiUser类(管理员)NormalUser类(管理员)opertion包IOperation接口FindOpertion(查找图书)AddOpertion(增加图书)DeletOpertion(删除图书)BorrowOpertion(借阅图书)ReturnOpertion(归还图书)ShowOp JavaEE线程安全的线程池实现 sugar high Javajava-eejava开发语言 线程虽然比进程更轻量,但是如果创建销毁的频率进一步增加,开销还是很大解决方案:线程池or协程线程池:把线程提前创建好放到池子里,后续用到线程直接从池子里取不必这边申请了。线程用完了也不是还给系统而是放回池子,以备下次再用。为什么线程放在池子里就比从系统申请释放来得更快呢?用户写的代码就是在最上面的应用程序来运行,这里的代码都称为“用户态”运行的代码,有些代码需要调用API进一步的逻辑就会在内核中执 java,深拷贝和浅拷贝 水w javajava开发语言拷贝 在Java中,深拷贝(DeepCopy)和浅拷贝(ShallowCopy)是对象拷贝的两种方式,主要区别在于它们如何处理对象的内部引用。目录一、浅拷贝(ShallowCopy)实现方式二、深拷贝(DeepCopy)实现方式1、手动深拷贝2、通过序列化实现深拷贝深拷贝中的注意事项深拷贝的应用场景总结一、浅拷贝(ShallowCopy)浅拷贝是指仅拷贝对象的基本类型字段和引用类型字段的引用,而不是引用 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开发人员都应该了解,另外:对自己写的代码大概占用多少内存,内存中是怎么布局的应该有一个直觉性的认识。