首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 复习笔记(五)—— OutOfMemoryError 可以被 try catch 吗 ?

在开发过程中,我们更多的应该及时暴露问题。除了 RuntimeException 以外,其他异常可以统称为 非运行时异常 或者 受检异常,这些异常必须被捕获,否则编译期就会报错。...《Java 虚拟机规范》对本地方法栈中方法使用的语言、使用方式和数据结构并没有任何强制规定,因此具体的虚拟机可以根据需要自由实现它。Hotspot 将本地方法栈和虚拟机栈合二为一。...虽然《Java 虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做“非堆”,目的是与 Java 堆分开来。...在 JDK 8 中,彻底废弃了永久代的概念。 如果方法区无法满足新的内存分配的需求时,将抛出 OutOfMemoryError 。 运行时常量池。方法区的一部分。...Class 文件的常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后方法方法去的运行时常量池。

59420

String s = new String(xyz)创建了几个实例你真的能答对吗?

首先,我不理解的是为什么很多答主总是用“常量池”来代替“字符串常量池”,在Java体系中,其实是有三个常量池的,三个常量池的概念和用处都不相同,混淆在一起容易给别人造成误解。...这里的ldc指令只是把先前在类加载过程中已经创建好的一个String实例("xyz")的一个引用压到操作数栈顶而已,并没有创建新的String实例。 不是应该有两个实例吗?...我们都知道类加载的解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程,根据JVM规范,符合规范的JVM实现应该在类加载的过程中创建并驻留一个String实例作为常量来对应"xyz"字面量,...klass,它是Java类的元信息在JVM中的存在形式。一个Java类被JVM类加载器加载之后,就是以klass的形式存在于JVM之中。 oop,它是Java对象在JVM中的存在形式。...举个例子:Java中String类的一个实例,在JVM中会有一个对应的instanceOopDesc实例。 字符串常量池 在Java体系中,有三种常量池: class字节码中的常量池:存在于硬盘上。

67310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    “面试不败计划”: java语言基础面试题(二)

    如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收...5、为什么要有不同的引用类型 不像C语言,我们可以控制内存的申请和释放,在Java中有时候我们需要适当的控制对象被回收的时机,因此就诞生了不同的引用类型,可以说不同的引用类型实则是对GC回收时机不可控的妥协...通过软引用实现Java对象的高速缓存:比如我们创建了一Person的类,如果每次需要查询一个人的信息,哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这将引起大量Person对象的消耗,并且由于这些对象的生命周期相对较短...将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合.如果hashcode相等,然后通过equal()方法判断要放入对象与集合中的任意对象是否相等:如果equal...如果两个对象相等,必须有相同的hashcode 值,反之不成立. 10、可以在hashcode中使用随机数字吗?

    47720

    java8以后字符串常量池的位置,以及元空间的探秘,使用VisualVM进行实战验证

    他们的说法有依据吗? ----   今天让我们来一起探讨一下这个问题 有人说字符串常量池在java堆中,可又有人说常量池存在元空间中。...2、Java方法区与元空间 ---- 为了解决这个问题,下面我们通过Idea、VisualVm、JDK(我用的是jdk14) 和 一段测试代码来探讨一下字符串常量池的位置 将下面代码粘贴到Idea中...---- 排除字符串常量池在虚拟机栈、程序计数器、本地方法栈的情况(Java虚拟机规范要求的),字符串常量池要么在堆中要么就在方法区中 ---- 假设字符串常量池在堆中   通过看VisualVM我们应该是判断不出字符串常量池是否在堆中的...(又要保证不OOM导致程序退出终止),如果常量池在方法区,那么方法区应该会增大,那么宿主机的内存就会被使用。...最终结论 真正意义上字符串常量池在堆中存储,元空间可能有引用堆中字符串常量,运行时常量池在方法区中。

    1.5K30

    你知道Java中final和static修饰的变量是在什么时候赋值的吗?

    我们看看JVM规范上的解释: 我们温习一下这个英语四级短语:appear as 然后,我们一起翻译一下: 在JVM层面上,每一个用Java写的构造方法都表现为实例初始方法,这个方法就是方法...解析:将常量池内的符号引用替换为直接引用。 初始化:执行类构造器方法。 上面出现类构造器方法,这个方法又是个什么东西呢?...在类构造器方法中赋值。 目前Oracle公司实现的Javac编译器的选择是: final+static修饰:使用ConstantValue属性赋值。...仅使用static修饰:在方法中赋值。这个方法在类加载的初始化阶段执行。...这是因为Class文件格式的常量类型中只有与基本属性和字符串相对应的字面量,所以就算ConstantValue属性想支持别的类型也无能为力。

    1.8K20

    征服Android面试官路漫漫(二):OutOfMemoryError 可以被 try catch 吗 ?

    《Java 虚拟机规范》对本地方法栈中方法使用的语言、使用方式和数据结构并没有任何强制规定,因此具体的虚拟机可以根据需要自由实现它。Hotspot 将本地方法栈和虚拟机栈合二为一。...虽然《Java 虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做“非堆”,目的是与 Java 堆分开来。...在 JDK 8 中,彻底废弃了永久代的概念。 如果方法区无法满足新的内存分配的需求时,将抛出 OutOfMemoryError 。 运行时常量池。方法区的一部分。...Class 文件的常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后方法方法去的运行时常量池。...唯一一个在《Java虚拟机规范》中没有规定任何 OutOfMemoryError 情况的区域是 程序计数器。

    2.5K01

    Java String 对象,你真的了解了吗?

    String 对象的实现 String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下...3、可以实现字符串常量池 String 对象的优化 字符串是我们常用的Java类型之一,所以对字符串的操作也是避免不了的,在对字符串的操作过程中,如果使用不当,性能会天差地别。...事实真的是这样吗?我们来做一个实验。我们使用+来拼接下面这段字符串。 String str8 = "ping" +"tou"+"ge"; 一起来分析一下这段代码会产生多少个对象?...公司对这一块进行了不少的优化,防止由于程序员不小心导致String性能急速下降,尽管 Java 公司在编译器这一块做了相应的优化,但是我们还是能看出 Java 公司优化的不足之处,在动态拼接字符串时,虽然使用了...*+\”regex元字符的情况下,不会使用正则表达式 传入的参数长度为2,第一个字符是反斜杠,并且第二个字符不是ASCII数字或ASCII字母的情况下,不会使用正则表达式 所以我们在字符串分割时,应该慎重使用

    82440

    2019年Java面试题基础系列228道(5),快看看哪些你还不会?

    与 a.equals(b) 有什么关系? 46、final、finalize 和 finally 的不同之处? 47、Java 中的编译期常量是什么?使用它又什么风险?...29、我们能在 Switch 中使用 String 吗? 从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。...内部实现在 switch 中使用字符串的 hash code。 30、Java 中的构造器链是什么? 当你从一个构造器中调用另一个构造器,就是 Java 中的构造器链。...这种情况只在重载了类的构造器的时候才会出现。 31、64 位 JVM 中,int 的长度是多数? Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。...finally是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。 47、Java 中的编译期常量是什么?

    61020

    JVM是如何执行Java程序的(串联JVM面试题)

    众所周知,高级编程语言编写的程序,最终要转化为机器码,才可以在计算机上运行。我们在编写完一段Java代码后,如果想要运行它,需要通过Java编译器,将其编译为JVM认识的字节码文件。...类加载器先工作类加载系统目的很明确,就是将字节码文件中的二进制数据准确地加载到JVM,从Class文件加载到内存 & 对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java使用类型执行Java...然后将文件中的常量池、字段、方法和指令等数据加载到JVM内存的共享区域方法区中。然后对其进行验证,目的是为了确保类的正确性。比如版本号为52或更高时,不应该存在这个版本不支持的指令。...符号引用是常量池中的类、方法、字段等指向的目标在字节码文件中的静态表示,当JVM运行时,需要将目标的静态表示转换成实际的内存指针,也就是直接引用。...“如何确定对象是垃圾”、“使用哪个垃圾回收器”、“用了什么回收算法”就需要我们去了解。实例初始化后,会将对象的引用存储到局部变量表中。这样的话,线程就可以通过引用访问到该对象。

    16920

    2019年Java面试题基础系列228道(1),快看看哪些你还不会?

    Java 中怎么创建一个不可变对象? 16、我们能创建一个包含可变对象的不可变对象吗? 17、Java 中应该使用什么数据类型来代表价格? 18、怎么将 byte 转换为 String?...19、Java 中怎样将 bytes 转换为 long 类型? 20、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于byte 类型的范围,将会出现什么现象?...62、两个相同的对象会有不同的的 hash code 吗? 63、我们可以在 hashcode() 中使用随机数字吗?...100、Java 中,怎样才能打印出数组中的重复元素? 101、Java 中如何将字符串转换为整数? 102、在没有使用临时变量的情况如何交换两个整数变量的值? 103、接口是什么?...我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。

    1.1K00

    Redis实战12-优惠券实现一人一单功能

    所以,我们就来对相关代码做抽取后进行封装:悲观锁,我们使用synchronized关键字来加锁。如下图:我们将锁直接加到方法上,可以吗?...是同一个用户,如果张三和李四都过来抢,这种情况下,锁不应该生效才对。根据上面的分析,我们将synchronized修改,不放到方法上。放到方法体内。锁对象也不用this。...我们知道,Java中String对象都是static fianl的,我们也知道有个常量池这个东西。...那么,我们可以不可以利用String这一特性来实现呢?答案是:可以的。我们使用String.intern()方法就可以。知识点扩展Java的String对象中intern()方法是干嘛的?...结束语大家好,我是凯哥Java(kaigejava),乐于分享技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~。

    97440

    方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?

    方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存,它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆。 1、此区域是线程共享的。...永久代 字符串常量池、运行时常量池、静态变量都是在永久代中 jdk1.7 永久代 字符串常量池和静态变量被移动到了堆当中,运行时常量池还是在永久代中 jdk1.8 元空间 字符串常量池和静态变量仍然在堆当中...;运行时常量池、类型信息、常量、字段、方法被移动都了元空间中 4、元空间的好处: ① 减少报OOM的可能:元空间与永久代类似,本质区别是元空间并不占用虚拟机内存了,而是使用本地内存,由于本地内存一般是比较大的...③类及相关的元数据的生命周期与类加载器的一致; ④ 每个加载器有专门的存储空间。...这样就避免了放到不频繁进行垃圾回收的元空间中应该被垃圾回收的对象而不能及时进行垃圾回收的浪费空间的现象出现。 思考:那么静态变量为什么也要在JDK7和字符串常量池一起移动到堆空间中呢?

    58000

    每日知识集之JVM篇

    方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。...该类所有实例都已经被回收,也就是java堆中不存在该类以及任何派生子类的实例 加载该类的类加载器已经被回收,这个条件除非精心设计的可替换类加载器的场景,如OSGi,JSP的重加载等,否则通常很难达成 对应该类的...查看类加载和卸载信息 在大量使用反射动态代理CGLIb等字节码框架,动态生成JSP以及OSGI这类频繁自定义类加载器场景中,通常都需要java虚拟机具备类型卸载的能了,以保证不会对方法区造成过大的内存压力...由于reference类型在java虚拟机规范中并没有定义这个引用应该通过什么方式去定位,所以对象访问方式也是由虚拟机自己决定的,主流的访问方式主要有两种:直接指针和句柄访问 句柄访问 直接指针 这两种方式各有优势...直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中的内存区域,在JDK1.4中新加入了NIO类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native

    41530

    如何在Java和Swift中避免空引用异常?

    换句话说,除非将变量显式声明为nullable(可空),否则它们不允许将空值分配给变量。在本文中,我们将概述不同编程语言中的可以减少或避免使用空值的一些特性。...在Java 10引入了一个更好的 Optional.orElseThrow ——它的使用方式一样,但是方法名是警告说,如果值不存在,将抛出一个异常。...Nullable Chaining 与Java中的Optionals 一样,Kotlin中的可空值也可以通过使用例如null-safe调用操作符进行链接。...否则,将声明一个本地常量,该常量仅在if块中有效。这个常量可以有与可选项相同的名称,这将导致在块中不可见的实际可选性。除了多个展开语句外,还可以向if let语句添加布尔表达式。...编译器通过使用控制传输语句(返回、抛出、中断、继续)或调用从未返回类型的方法来确保这个else块退出其封闭范围。可选项的未包装值可以在保护语句的封闭范围中看到,在这里可以像使用普通常量一样使用它。

    2.7K30

    Java核心技术卷2 高级特性 学习笔记(4)

    在Java中,注解是当做一个修饰符来使用的,被置于被注解项之前,中间没有分号。...这些接口中的方法与注解中的元素相对应。 注解本身不会做任何事情,它们只是存在于源文件中,编译器将它们置于类文件中,并且虚拟机会将它们载入。...Extends @Localized Message> 与方法和构造器引用一起使用:@Localized Message::getText 可以将注解放置到注入private和static这样的其他修饰符的前面或后面...用于管理资源的注解 @PostConstruct和@PreDestroy注解用于控制对象声明周期的环境中,例如Web容器和应用服务器,标记了这些注解的方法应该在对象被构建之后,或者在对象被移除之前,紧接着调用...语言模型API,可以使用语言模型API来分析源码级的注解,与呈现类和方法的虚拟机表示形式的反射API不同,语言模型API让我们可以根据Java语言的规则去分析Java程序。

    69010

    int和Integer有什么区别?

    关于Integer的值缓存,这涉及Java 5中另一个改进。构建Integer对象的传统方式是直接调用构造器,直接new一个对象。...但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在Java 5中新增了静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。...我在前面提到使用静态工厂方法valueOf会使用到缓存机制,那么自动装箱的时候,缓存机制起作用吗?为什么我们需要原始数据类型,Java的对象似乎也很高效,应用中具体会产生哪些差异?...阅读过Integer源码吗?分析下类或某些方法的设计要点。似乎有太多内容可以探讨,我们一起来分析一下。知识扩展1.理解自动装箱、拆箱自动装箱实际上算是一种语法糖。什么是语法糖?...当然,在大多数产品代码里,并没有必要这么做,还是以开发效率优先。以我们经常会使用到的计数器实现为例,下面是一个常见的线程安全计数器实现。

    4.1K20

    来聊一聊JVM

    为什么需要JVM,不要JVM可以吗? 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译,到处运行 2.JVM可以运行Class文件 我们的编译器到底干了什么事?...1.装载 Class文件 – >二进制字节流 -->java中的寻找器(类加载器) 1)通过一个类的全限定名(标识位)获取这个类的二进制字节流 2)将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构...第二种,使用线程上下文加载器,可以通过java.lang.Thread类的setContextClassLoader()方法来设置当前类使用的类加载器类型。...其实可以一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构...我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。

    6410

    15道大厂Java高频面试题(二)

    中的包 Java中的包 在Java中,包(Package)是一种将类和接口组织在一起的方式,以便于管理大型项目中的代码。...高内聚,低耦合: 一个类应该具有高内聚性,即类中的所有方法都应该与类的目的紧密相关。同时,类与类之间的耦合度应该尽可能低。...对象引用: 在Java中,对象的引用实际上存储在栈上,指向堆中对象的实际位置。 垃圾回收: Java的垃圾收集器定期检查堆中的对象,回收那些不再被引用的对象,以释放内存。...} } 在这个示例中,我们通过toCharArray()方法将String对象转换成了一个char数组,这表明String对象实际上是以char数组的形式存储其数据的。...以下是字符串常量池的一些关键特性: 存储位置: 在Java 7及之前的版本中,字符串常量池位于方法区内。 从Java 7开始,字符串常量池被移到堆内存中,以减少方法区的压力。

    13110

    Java 类的一生

    其使用的就是第二步填充的那个符号表的信息。这一步比较关键的内容就是生成 方法和 方法。类构造器和实例构造器。这个实例构造器和我们代码中的构造函数不同。...内容的话,比如 Java 中的方法为例 public void fun(param1,param2) 那么在符号表中就要保存 fun 与之对应的值,param1 与之对应的值,以此类推。...加载的过程中,主要是将这个字节码二进制流转换成虚拟机所能使用的信息,基本内容包含 通过全部限定名来获取一个二进制的字节流; 把字节流中定义的内容转到方法区中的数据结构; 生成一个可以表示这个二进制流的...>()方法与类的构造函数(即在虚拟机视角中的实例构造器()方法)不同,它不需要显式地调用父类构造器,Java虚拟机会保证在子类的()方法执行前,父类的()方法已经执行完毕...解析 解析阶段将类的符号引用替换为直接引用 符号引用(Symbolic References):还记得之前文章中提到的 Class 文件中存的内容吗,还记得那些表吗?这个符号引用就是那时的索引。

    34410

    搜狗面经汇总

    程序计数器:记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。 Java虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。...每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 本地方法栈:与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。...方法区:方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。...Object Class Data(类定义数据)是存储在方法区的,此外,常量、静态变量、JIT编译后的代码也存储在方法区。 运行时常量池:运行时常量池是方法区的一部分。...避免在Java堆和Native堆中来回复制数据。 jvm垃圾回收器 三、数据结构与算法 手写算法:排序。

    71760
    领券