jvm

Java基础常见面试题最后十题

两盒软妹~` 提交于 2020-02-24 20:15:48
1.为什么等待(wait())和通知(notify())是在 Object 类而不是 Thread 中声明的? 生产者-消费者问题代码实现 ①.生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 ②.解决办法:要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方法解决该问题,常用的方法有信号灯法等。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。 void notify() 唤醒在此对象监视器上等待的单个线程 void notifyAll()

深入理解JAVA虚拟机JVM

不打扰是莪最后的温柔 提交于 2020-02-24 16:47:38
深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。java之所以能实现一次编写到处执行,也就是因为jVM。 原理: 编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行。JVM抹平了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现了java平台无关性。它是 Java 程序能在多平台间进行无缝移植的可靠保证,同时也是 Java 程序的安全检验引擎(还进行安全检查)。 JVM 是 编译后的 Java 程序(.class文件)和硬件系统之间的接口 ( 编译后:javac 是收录于 JDK 中的 Java 语言编译器。该工具可以将后缀名为. java 的源文件编译为后缀名为. class 的可以运行于 Java 虚拟机的字节码。) JVM的工作结构大致如下: JVM结构浅显了解: java开发人员写好的文件,都是.java文件。如果是想要被jvm加载必须要先经过编译为字节码文件。在经过调用javac编译好后生成了java字节码文件(.class)。然后才能被jvm加载。 在生成了class文件之后

做Java开发这一年

怎甘沉沦 提交于 2020-02-24 15:53:15
从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有一年的时间了。通过这一年时间也有些感触,想从几个面比较一下这两个平台。希望能做到客观公正。 语言 我原来是使用C#语言的,和现在的Java语言相比,现在的Java语言语法就停留在C# 2.0这个年代。语法结构都非常传统,中规中矩。很突出的一点是,因为缺少对闭包的支持,有些用C#很容易做到的,用Java需要写很多废话代码。 前几天InfoQ上发表了一篇英国卫报逐步采用Scala替换Java的文章里一句话用的很好:看Java的代码很容易让你只见树木,不见森林。因为为了实现某个功能,你需要太多的支撑代码,而实现功能的关键代码却迷失了。 举个例子:我需要一个排好序的用户列表,排序的依据是用户名字。很简单的需求对不。自然的代码肯定是这样的: IList<User> users = … users.OrderBy(user => user.Name); 而如果用Java实现同样的功能你可能要这样写: List<User> users = … Collections.sort(users,new Comparator<User>() { public int compare(User left, User right) { return left.getName().compareTo(right

Java Class Loader

北战南征 提交于 2020-02-24 14:29:47
Reference: [1] http://www.cnblogs.com/kevin2chen/p/6714214.html 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程。同一个jvm的所有线程、所有变量都处于同一个进程里,都使用该jvm进程的内存区。 jvm进程终止,jvm内存中的数据将全部丢失。 jvm进程终止的情况: 1.程序运行到最后正常结束。 2.遇到System.exit()或Runtime.getRuntime.exit()。 3.遇到未捕获的异常或错误 4.程序所在的平台强制结束了JVM进程 类的加载 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会进行类加载。类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class的实例。因为java中万物皆为对象,类也是java.lang.Class类型的对象。 类加载具体有加载、连接和初始化3个步骤,加载阶段需要完成的事情有:   1)通过一个类的全限定名来获取定义此类的二进制字节流。   2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。   3)在java堆中生成一个代表这个类的Class对象,作为访问方法区中这些数据的入口。 类的加载,是由类加载器来完成的,类加载器通常由JVM提供。通过使用不同的类加载器

How does bipush work in JVM?

狂风中的少年 提交于 2020-02-24 12:24:29
问题 I understand iload takes in integers -1 to 5, but how can you extend to higher numbers using a bipush instruction? How is the specific integer being stored with the bytecode? 回答1: There's several different instructions that can be used to push an integer constant. The smallest is the iconst_* instructions. These are only a single byte, because the value is encoded in the opcode itself. iconst_1, iconst_2, etc. are different opcodes. iconst_5 for example would be encoded as the byte 08 . Note:

How does bipush work in JVM?

℡╲_俬逩灬. 提交于 2020-02-24 12:24:12
问题 I understand iload takes in integers -1 to 5, but how can you extend to higher numbers using a bipush instruction? How is the specific integer being stored with the bytecode? 回答1: There's several different instructions that can be used to push an integer constant. The smallest is the iconst_* instructions. These are only a single byte, because the value is encoded in the opcode itself. iconst_1, iconst_2, etc. are different opcodes. iconst_5 for example would be encoded as the byte 08 . Note:

OQL in VisualVM v1.4.4 - Get A Class's Field Names

◇◆丶佛笑我妖孽 提交于 2020-02-24 07:02:22
问题 I would like to execute an OQL query in VisualVM (v1.4.4) to retrieve the (non-static) field names for an object. The OQL documentation describes heap.findClass(className) . This returns an object which includes a fields property (an array of field names). When I execute the following OQL... heap.findClass('java.io.ByteArrayInputStream').fields; ... it returns an array of 4 field objects ( ByteArrayInputStream has 4 fields - buf , count , mark , and pos - I am assuming these are what are

找工作——异常处理

不想你离开。 提交于 2020-02-23 19:05:42
异常是指程序运行时(非编译时)所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。这个异常可以在catch程序中进行捕获,然后进行处理。而异常处理的目的则是为了提高程序的安全性和鲁棒性。 JAVA提供了两种错误的异常类,分别为Error和Exception Error :表示在程序运行期间出现了非常严重的错误,并且该错误是不可恢复的,由于这属于JVM层次的严重错误,因此这种错误是会导致程序终止执行的。此外编译器不会检查Error是否被处理,因此在程序中不推荐捕获Error类型的异常。 OutOfMemoryError、ThreadDeath等都属于错误。 throwable Exception :表示可以恢复的异常,是编译器可以捕捉到的。 运行时异常(runtime exception):编译器没有强制对运行时异常进行捕获并处理,如果不对这种异常进行处理,当出现这种异常时,会由JVM来处理,出现运行时异常后,系统会一直网上曾抛,直到遇到处理代码位置。若没有处理块,如果是线程,那么这个线程就退出了,如果是主程序异常那么整个程序就退出了。 所以,如果不对运行时异常进行处理,后果是非常严重的,一旦发生,要么线程终止,要么是主程序终止。 检查异常(checked exception):所有继承自Exception不是运行时异常的异常都是检查异常

JVM 垃圾回收

孤街醉人 提交于 2020-02-23 13:14:08
JVM 垃圾回收 这篇文章尝试对当前主流的JVM垃圾回收机制进行简要介绍。 一 垃圾回收讨论的范围 JVM 的内存分为方法区,JVM栈,本地方法栈,堆,程序计数器等几个部分。 其中程序计数器,JVM栈,本地方法栈三部分的生命周期与线程相同,随着线程的回收这几部分内存其生命周期自然结束而得以回收。 而方法区用于存储静态变量、常量、类信息等数据,堆更是用于创建对象时在其上划分内存。随着程序的运行,这些数据何时不再有用,需要被回收便是垃圾回收所关注的问题。 二 垃圾回收的基本策略 垃圾回收所要解决的问题便是将内存中无用的对象进行回收,以便释放出内存空间用于后续程序运行分配空间的需要。这里的问题主要有: 对象何时会无用 如何回收更加高效 对象何时会无用? 换句话说便是如何判断对象不会再被任何程序使用。一种解决方案是所谓“引用计数法”,即当程序中每有一处引用该对象时,引用技术器+1,当每有一处引用失效时,对应-1,当一个对象的“引用计数器”归零时,便认为其可以被回收。这种方案看似行之有效,但一个潜在的问题便是循环引用,假设A对象持有B对象的一个引用,B对象同时持有A对象的一个引用,当程序中任何其他地方不再有指向这两个对象的引用时,A和B仍旧互相持有,这导致A和B将永远不能被回收,试想程序中出现多处类似的现象,将极易引发内存溢出。 主流的程序语言中,通常采用可达性分析(Reachability

JVM学习——字节码(学习过程)

旧街凉风 提交于 2020-02-23 12:23:15
JVM——字节码 为什么要学字节码 字节码文件,有什么用? JVM虚拟机的特点:一处编译,多处运行。 多处运行,靠的是.class 字节码文件。 JVM本身,并不是跨平台的。Java之所以跨平台,是因为JVM本身不夸平台。 二进制的文件,显然不是给人看的。是给机器看的。 从根源了解了之后,返回到语言层次 好多都会豁然开朗。 必须要学,学一个东西,还需要理由吗? Java语言规范补充: JVM虚拟机规范(相对底层的)Java,Groovy,kotlin,Scala。 编译后都是Class文件,所以就都能在JVM虚拟机上运行。 字节码:枯燥且重要 字节码文件解读 一个Java类,然后进行编译成字节码文件 package com.dawa.jvm.bytecode; public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } javap 编译后的结果: ➜ main javap com.dawa.jvm.bytecode.MyTest1 Compiled from "MyTest1.java" public class com.dawa.jvm.bytecode.MyTest1 { public com.dawa