关于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的一些东西,以便可以更多一点认知. ...
随机推荐
- Gym - 100187E E - Two Labyrinths —— bfs
题目链接:http://codeforces.com/gym/100187/problem/E 题解:一开始做的时候是将两幅图合并,然后直接bfs看是否能到达终点.但这种做法的错的,因为走出来的路对于 ...
- 自动化测试框架selenium+java+TestNG——配置篇
最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...
- python生成图片
# -*- coding:utf-8 -*- from pylab import * figure(1,figsize=(6,6)) ax = axes([0.1,0.1,0.8,0.8]) frac ...
- elasearch基础教程
Elasticsearch基础教程 翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助 ...
- CNN卷积神经网络_深度残差网络 ResNet——解决神经网络过深反而引起误差增加的根本问题,Highway NetWork 则允许保留一定比例的原始输入 x。(这种思想在inception模型也有,例如卷积是concat并行,而不是串行)这样前面一层的信息,有一定比例可以不经过矩阵乘法和非线性变换,直接传输到下一层,仿佛一条信息高速公路,因此得名Highway Network
from:https://blog.csdn.net/diamonjoy_zone/article/details/70904212 环境:Win8.1 TensorFlow1.0.1 软件:Anac ...
- CentOS6.5 yum源设置
在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度. 国内比较快的有163源.sohu源.这里以163源为例子. 1. cd /etc/yum.repos.d 2 ...
- swoole异步redis安装前置条件和流程
---恢复内容开始--- 1.redis服务 确认redis在服务器中已经安装了 2.hiredis库 第二步安装hiredis 下载位置 2.1获取 安装包https://github.com/re ...
- css font-family(字体样式)
之前因为用的很少,所以没注意,最近做APP混合开发, 给字体一个样式 font-family:" 微软雅黑": 发现在有的手机上有效,但是在有的手机上是无效的, 解决方法: ...
- DLL的远程注入技术
DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...
- ABP 框架启程 及 ABP 翻译目录及传送门
准备动手写一套电商的系统,辗转收集了不少相关的开源项目,最后决定使用ABP作为起点. 在园子里好多人都在推广ABP.有个园友做了一个集合贴,方便大家使用 ABP集合贴 建议大家优先看 HK Zhan ...