对象

【转】HotSpot虚拟机对象探秘

冷暖自知 提交于 2020-04-09 19:53:46
请读者首先注意本篇的题目中的限定语“HotSpot虚拟机”,在虚拟机规范中明确写道, 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节。 例如:运行时数据区的内存如何布局、选用哪种垃圾收集的算法等”。因此,本篇(整个内存篇中所有的文章)的内容会涉及到虚拟机“自主决定”的实现,我们的讨论将在HotSpot VM的范围内展开。同时,我也假定读者已经理解了虚拟机规范中所定义的JVM公共内存模型,例如运行时数据区域、栈帧结构等基础知识,如果读者对这些内容有疑问,可以先阅读《Java虚拟机规范(JavaSE 7 Editon)》[注1]第2章或《深入理解Java虚拟机:JVM高级特性与最佳实践》[注2]的第2、3章相关内容。 对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(本文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过的。如果没有,那必须先执行相应的类加载过程。

scala入门-09 scala高阶函数

為{幸葍}努か 提交于 2020-03-12 01:52:21
我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一个List集合: List集合所在的包已经被预定义自动引入,所以此处就不需要在引入包了,这里直接使用List实例化对象,其实用List的object对象的apply方法 我们使用map函数把list中的每个值都乘以3: x表示l中每一个元素,map对l中的每一个元素进行遍历操作,由于List中只有一种类型的元素,所以我们在执行马屁操作的时候可以省略其类型,如下所示: List集合中只有一个参数的时候,我们可以去掉参数中的括号: 为了能保存所有代码,我还是使用IDEA吧 scala中的集合: 集合主要有List、Set、Tuple、Map等 在scala下的org.scala.collection下创建scala类CollectionOperations 在IDEA中创建一个List实例: 我们看一下List代码实现: 源码中说明了其内部是apply的方式来完成实例化的: 使用同样的方式实例化Set: 我们可也看下Set实例化对象的实现: 接下来我们在linux命令行终端中砍下集合的操作,首先看Set: 发现Set中不会存储重复的元素 下面看下Tuple的申明和使用: tuple 访问的时候下标是从1开始的 对于Tuple而言

【Java:对象的强、软、弱和虚引用】Java对象的强、软、弱和虚引用的概念、应用。

本秂侑毒 提交于 2020-03-09 19:37:37
http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。图1为对象应用类层次。 图1 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 ⑵软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 ⑶弱引用(WeakReference)

【Java对象生命周期】Java对象的生命周期:java是怎么分配内存的和怎么回收的?

两盒软妹~` 提交于 2019-12-27 13:56:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>   http://www.uml.org.cn/j2ee/201301183.asp 要理解java对象的生命周期,我们需要要明白两个问题,   1、java是怎么分配内存的 ,2、java是怎么回收内存的。   喜欢java的人,往往因为它的内存自动管理机制,不喜欢java的人,往往也是因为它的内存自动管理。我属于前者,这几年的coding经验让我认识到,要写好java程序,理解java的内存管理机制是多么的重要。任何语言,内存管理无外乎分配和回收,在C中我们可以用malloc动态申请内存,调用free释放申请的内存;在C++中,我们可以用new操作符在堆中动态申请内存,编写析构函数调用delete释放申请的内存;那么在java中究竟是内存怎样管理的呢?要弄清这个问题,我们首先要了解java内存的分配机制,在java虚拟机规范里,JVM被分为7个内存区域,但是规范这毕竟只是规范,就像我们编写的接口一样,虽然最终行为一致,但是个人的实现可能千差万别,各个厂商的JVM实现也不尽相同,在这里,我们只针对sun的Hotspot虚拟机讨论,该虚拟机也是目前应用最广泛的虚拟机。   虚拟器规范中的7个内存区域分别是三个线程私有的和四个线程共享的内存区,线程私有的内存区域与线程具有相同的生命周期,它们分别是: 指令计数器、

Java 比较相等 == or .equal()?

爷,独闯天下 提交于 2019-12-15 20:25:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天在做leetcode时遇到了一个比较是否相等的问题。 题目如下: LEETCODE 242. Valid Anagram Given two strings s and t , write a function to determine if t is an anagram of s . For example, s = "anagram", t = "nagaram", return true. s = "rat", t = "car", return false. Note: You may assume the string contains only lowercase alphabets. 看了discuss上的答案,自己写的代码: public class Solution { public boolean isAnagram(String s, String t) { char[] sa = s.toCharArray(); char[] ta = t.toCharArray(); Arrays.sort(sa); Arrays.sort(ta); if(Arrays.equals(sa, ta)){ //不能用sa==ta...why?? return true; } else return

scala入门-07特质类(trait)的使用

霸气de小男生 提交于 2019-12-10 05:07:36
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方法,使用trait的方法是with而混入类中。 我们在scala下的org.scala.clazz下创建一个类MyTrait.scala 定义一个特质类 Logger 定义MyLogger类 实现特质类Logger 调用: PS:我们这里使用trait是使用extends,这是因为MyLogger没有继承其他类火灾trait 子trait可以覆盖实现父traitd的方法: 调用: 如果子trait在如果覆盖父trait中已经实现的方法必须使用override关键字: 定义抽象类Account和class MyAccont 调用: 这是demo属于在一个对象中混入trait 来源: oschina 链接: https://my.oschina.net/u/230960/blog/366652

Objective-C对象模型及应用

自作多情 提交于 2019-12-09 17:51:59
本文主要介绍 Objective-C对象模型 的实现细节,以及Objective-C语言对象模型中对isa swizzling和method swizzling的支持。希望本文能加深你对Objective-C对象的理解。 ISA指针 Objective-C是一门面向对象的编程语言。每一个对象都是一个类的实例。在 Objective-C语言 的内部,每一个对象都有一个名为isa的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。 在XCode中按Shift + Command + O, 然后输入NSObject.h和objc.h,可以打开NSObject的定义头文件,通过头文件我们可以看到,NSObject就是一个包含isa指针的结构体,如下图所示: 按照面向对象语言的设计原则,所有事物都应该是对象(严格来说Objective-C并没有完全做到这一点,因为它有象int, double这样的简单变量类型)。在Objective-C语言中,每一个类实际上也是一个对象。每一个类也有一个名为isa的指针。每一个类也可以接受消息,例如[NSObject alloc],就是向NSObject这个类发送名为alloc消息。 在XCode中按Shift + Command + O,

第六章 对象

狂风中的少年 提交于 2019-12-07 08:36:13
1、 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法 object Conversions{ def inchesToCentimeters()={} def gallonsToLiters()={} def milesToKilometers()={} } 2、前一个练习不是很面向对象。提供一个通用的超类UnitConversion并定义扩展该超类的InchesToCentimeters, GallonsToLiters和MilesToKilometers对象 class UnitConversion{ def inchesToCentimeters(){} def gallonsToLiters(){} def milesToKilometers(){} } object InchesToCentimeters extends UnitConversion{ override def inchesToCentimeters()={} } object GallonsToLiters extends UnitConversion{ override def gallonsToLiters()={} } object MilesToKilometers extends

Android缓存字符串,对象等其他数据

半腔热情 提交于 2019-12-04 23:47:26
ACache是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。 ‍ ‍ 1、它可以缓存什么东西? ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ 普通的字符串、json、序列化的java对象,和 字节数字。 ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ 2、它有什么特色? 特色主要是: 1:轻,轻到只有一个JAVA文件。 2:可配置,可以配置缓存路径,缓存大小,缓存数量等。 3:可以设置缓存超时时间,缓存超时自动失效,并被删除。 4:多进程的支持。 下面附上完整代码: public class ACache { public static final int TIME_HOUR = 60 * 60; public static final int TIME_DAY = TIME_HOUR * 24; private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb private static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量 private static Map<String, ACache> mInstanceMap = new HashMap<String, ACache>();

Python动态类型的学习---引用的理解

倖福魔咒の 提交于 2019-12-03 04:55:21
一,Python浅拷贝和深拷贝 浅拷贝 是指拷贝的只是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。这里有个例子 >>> aList=[[1, 2], 3, 4] >>> bList = aList[:] #利用切片完成一次浅拷贝 >>> id(aList) 3084416588L >>> id(bList) 3084418156L >>> aList[0][0] = 5 >>> aList [[5, 2], 3, 4] >>> bList [[5, 2], 3, 4] 可以看到,浅拷贝生产了一个新的对象bList,但是aList的内容确实对aList的引用,所以但改变aList中值的时候,bList的值也跟着变化了。 但是有点需要特别提醒的,如果对象本身是不可变的,那么浅拷贝时也会产生两个值,见这个例子: >>> aList = [1, 2] >>> bList = aList[:] >>> bList [1, 2] >>> aList [1, 2] >>> aList[1]=111 >>> aList [1, 111] >>> bList [1, 2] 为什么bList的第二个元素没有变成111呢?因为数字在python中是不可变类型!! 这个顺便回顾下Python标准类型的分类: 可变类型: 列表,字典 不可变类型:数字