1、在JDK1.6(HotSpot虚拟机)及之前,运行时常量池(属于方法区的一部分)是永久代的,而在JDK1.7之后运行时常量池(里面用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池当中存放)已经从永久代(Permanent Generation)移出。(问:那么方法区其他部分有没有移出永久代?)

2、关于String.intern()方法,在1.6及以前会把首次遇到的字符串实例复制到永久代当中去,返回的也是永久代中这个字符串实例的引用;在1.7之后intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用,返回的就是那个实例引用。

3、Java的JVM并不是通过引用计数来进行GC,因为它很难解决对象之间相互循环引用的问题,譬如:

public class Test{
public Object instance = null; public static void testGC(){
Test objA = new Test();
Test objB = new Test(); objA.instance = objB;
objB.instance = objA; objA=null;
objB=null;
//假设在这行发生了GC,objA 和 objB能否被回收?
System.gc();
}
}

虽然这两个对象都已经不可能再被访问了,但是由于他们相互引用这对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。

4、Java采用可达性分析来判断对象是否存活,一般通过”GC ROOTS“的对象来作为起始点,一般可作为“GC roots”的对象包括下面4种:

  1)虚拟机栈(栈帧中的本地变量表)中引用的对象。

  2)方法区中类静态属性引用的对象。

  3)方法区中常量引用的对象。

  4)本地方法栈中JNI(即一般说的Native方法)引用的对象。

5、JDK1.2之后Java对引用的概念进行了扩充,分为四种,引用强度依次从强到弱为强引用>软引用>弱引用>虚引用

  强引用是普通的类似 Object obj = new Object()的对象引用

  软引用(通过SoftReference类来实现)用来描述一些还有用但不是必须的对象,当发生内存溢出异常之前,将会把这一类对象列入回收范围之中进行第二次回收,如果这次回收之后还是不够,就报内存溢出异常。

  弱引用(WeakReference类来实现)也是用来描述非必须对象,但它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前

  虚引用(PhantomReference)最弱的一种引用关系,无法通过虚引用来取得一个对象实例,一般为对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收的时候收到一个系统通知。

6、Class文件当中的一些数据项目:

  常量池容量计数值(constant_pool_count),用于表示常量池中常量的数值。需要注意的是这里容量计数是从1开始的,因为0有特别用途,比如0x0016表示十进制的22,这就代表常量池中有21项常量,索引范围为1~21.

  常量池中主要存放两大类常量:字面量(如文本字符串,声明为final的常量值) 和 符号引用 (属于编译原理方面的概念,包括三类常量 见P168)

7、类从被加载到虚拟机内存到卸载出内存为止,整个生命周期包括哪些阶段?

  一共包括7个阶段。加载->验证->准备->解析->初始化->使用->卸载。其中验证、准备、解析3个部分统称为连接。

  需要注意的是,加载(Loading)是类加载(Class Loading)过程的一个阶段,别混淆了两个概念。类加载过程包括上述的前5个过程。

  验证阶段大致上会完成4个阶段的验证动作:文件格式验证、元数据验证、字节码验证、符号引用验证。

8、使用volatile修饰的变量在并发下的运算一定是安全的吗?

  由于java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的。由于volatile变量只能保证可见性,所以只有满足以下两条规则的运算场景才可以不用锁就能保证原子性。

  1)运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。

  2)变量不需要与其他的状态变量共同参与不变约束。

  volatile的可见性是通过Java内存模型对volatile变量定义的特殊规则,每次使用前都要read、load,每次用完都要store、write相关联,必须连续一起出现。

9、线程的实现一般有三种:内核线程实现(包括高级接口——轻量级进程)、用户线程实现、用户线程实现加轻量级进程混合实现

  内核线程实现优点:即使有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程继续工作

        缺点:系统调用代价比较高,需要在两种态当中来回切换,由于每个LWP都需要一个内核线程的支持,因此会消耗内核资源,支持的数量有限。

  用户线程实现优点:操作快,消耗少,支持规模更大的线程数量

        缺点:阻塞问题如何处理,多处理器系统中如何将线程映射到其他处理器上,这类问题解决起来异常困难

  混合实现:

10、线程调度方式主要分为两种:协同式和抢占式。

11、自旋锁(JVM层面的锁优化技术):在许多应用上,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得,所以如果物理机器有一个以上的处理器,能让两个或以上的线程同时并行执行,我们就可以让后面请求所的那个线程“稍等一下”,看看持有锁的线程是否很快就释放锁,这种让线程采用忙循环(自旋),这项技术就是所谓的自旋锁。

  优点:避免线程切换的开销(内核态与用户态的上下文切换)

  缺点:占用处理器的时间,对处理器数量有要求。

12、Java语言定义的GC Roots对象包括:

  1)虚拟机栈(栈帧中的本地变量表)中引用的对象。

  2)方法区中静态属性引用的对象

  3)方法区中常量引用的对象

  4)本地方法栈中JNI引用的对象

关于JVM的一些东西的更多相关文章

  1. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. 弄懂 JRE、JDK、JVM 之间的区别与联系

    其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云.本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之 ...

  4. java基础(1)IntelliJ IDEA入门和数组操作 解决idea启动速度慢--配置JVM

    一. IntelliJ IDEA入门 1 快捷键和技巧 智能补全代码,比如只写首字母按回车: psvm+Enter :public stactic void main(String[] args) s ...

  5. 浅谈JVM内存模型

    JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途.目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区. 程序计数 ...

  6. JVM —— Java 对象占用空间大小计算

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 须要知道缓存的对象是否会超过 JVM 最大堆限制, 假设会超 ...

  7. jre、jdk、jvm之间的关系

    很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的. JVM(Java Virtual Machine) Java 虚拟机.它只认识 xxx.c ...

  8. 五分钟学Java:如何学习Java面试必考的JVM虚拟机

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

  9. JVM系列(四):java方法的查找过程实现

    经过前面几章的简单介绍,我们已经大致了解了jvm的启动框架和执行流程了.不过,这些都是些无关痛痒的问题,几行文字描述一下即可. 所以,今天我们从另一个角度来讲解jvm的一些东西,以便可以更多一点认知. ...

随机推荐

  1. 将自定义参数从uboot传入kernel的并读取的方法【转】

    本文转载自:http://blog.csdn.net/qq_29729577/article/details/50580727 希望朋友们多多指点,好的技术或心得一起分享: uboot向kernel传 ...

  2. [RK3288][Android6.0] 调试笔记 --- 软硬键盘同时使用【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/78748313 Platform: RK3288 OS: Android 6.0 Kernel ...

  3. win7 64位系统与Ubuntu14.04 64位系统双系统安装【转】

    本文转载自:http://blog.csdn.net/strugglepeach/article/details/51260886 Window 7 + Ubuntu 双系统安装   硬件: Thin ...

  4. 基于BASYS2的VHDL程序——数字钟(改进版)

    扩展到时分秒.加了入调时电路,但不知道为什么有两个按键不好使.而且不知道以何种方式假如按键消抖电路,因为加入后会多个时钟控制一个信号,物理不可实现.调试电路待解决.还有,四个数目管中间的那两个圆点怎么 ...

  5. 解决最近windows版本Node.js中npm出现的“Error: ENOENT, stat 'C:\Users\UserName\AppData\Roaming\npm”的问题

    (转载请注明出处,from www.cnblogs.com/xdxer) 问题可能如下所示 解决方案: 在 'C:\Users\UserName\AppData\Roaming\‘ 下手动的增加一个文 ...

  6. linux命令:wc命令

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  7. Algorithms : Programming Assignment 3: Pattern Recognition

    Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...

  8. Multipath TCP on iOS11 : A closer look at the TCP Options(转)

    Multipath TCP uses a variety of TCP options to use different paths simultaneously. Several Multipath ...

  9. Flutter实战视频-移动电商-55.购物车_底部结算栏UI制作

    55.购物车_底部结算栏UI制作 主要做下面结算这一栏目 cart_bottom.dart页面 先设置下内边距 拆分成三个子元素 全选 因为有一个文本框和一个全选的text文本,所以这里也用了Row布 ...

  10. Several ports (8005, 8080, 8009) required

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...