关于JVM的一些东西
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的一些东西的更多相关文章
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- 弄懂 JRE、JDK、JVM 之间的区别与联系
其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云.本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之 ...
- java基础(1)IntelliJ IDEA入门和数组操作 解决idea启动速度慢--配置JVM
一. IntelliJ IDEA入门 1 快捷键和技巧 智能补全代码,比如只写首字母按回车: psvm+Enter :public stactic void main(String[] args) s ...
- 浅谈JVM内存模型
JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途.目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区. 程序计数 ...
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 须要知道缓存的对象是否会超过 JVM 最大堆限制, 假设会超 ...
- jre、jdk、jvm之间的关系
很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的. JVM(Java Virtual Machine) Java 虚拟机.它只认识 xxx.c ...
- 五分钟学Java:如何学习Java面试必考的JVM虚拟机
原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...
- JVM系列(四):java方法的查找过程实现
经过前面几章的简单介绍,我们已经大致了解了jvm的启动框架和执行流程了.不过,这些都是些无关痛痒的问题,几行文字描述一下即可. 所以,今天我们从另一个角度来讲解jvm的一些东西,以便可以更多一点认知. ...
随机推荐
- 实用jQuery代码片段
maco精选的一些jQuery代码,也许你从中可以举一反三[代码] [JavaScript]代码001<p>002 <h3><span >★ 使用jQuery ...
- phpcms 内容模块PC标签调用
PHPcms 调用命令的基本格式: 开始:{pc:content action="模块操作名" catid="调用栏目ID" num="数据调用数量& ...
- hdu 1205 吃糖果(抽屉原理)
题意:N种糖果,不能把一样的放在一起吃,即第一次吃一种,下一次吃另一种. 思路:找到个数最多的糖果种类(最大的数目记作 ma,该糖果种类记为a),首先把这n个糖果放到n个抽屉里面,然后把剩余的N-1种 ...
- PS 图像滤镜— — USM 锐化
这个算法的原理很简单,就是先用高斯模糊获取图像的低频信息,然后用原图减去高斯模糊之后的图,得到图像的高频信息,再将原图与高频信息融合,进一步增强原图的高频信息,看起来,图像的边缘显得特别的sharp. ...
- CodeForces990G:GCD Counting(树分治+GCD)
You are given a tree consisting of nn vertices. A number is written on each vertex; the number on ve ...
- Ubuntu16.04 安装cuda9.0 cudnn 7.0.5
参考网址:https://blog.csdn.net/zhuangwu116/article/details/81063234 (1)下载安装文件: 下载cuda9.0 runfile 文件 下载地址 ...
- 关于ubuntu 16.04 docker常用命令
1.sudo docker ps -a 查看当前docker实例的信息: CONTAINER ID IMAGE COMMAND ...
- opencv 知识点笔记
1.Opencv中cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B
- 【旧文章搬运】关于NtUserBuildHwndList的一点记录~
原文发表于百度空间,2011-04-07========================================================================== 该函数与r ...
- python 之 exec命令
参数1:字符串形式的命令 参数2:全局作用域(字典形式),如果不指定默认使用globals() 参数3:局部作用域(字典形式),如果不指定默认使用locals() g= { 'x':1, 'y':2 ...