关于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、

时间: 2024-11-05 01:14:13

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

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

零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超过要设置相应算法如 LRU 来丢弃一部分缓存数据以满足后续内容的缓存 JVM 参数设置: 如果知道对象会被创建, 可以帮助判断 -Xmx 需要设置多少 只是为了好玩 一. 对象的内存布局 HotSpot 虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instan

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

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初识JVM byte code

关于JVM和其上的byte code,网上其实有足够多的资料了,我这里就简单做个提纲和介绍,权当记录吧. stack-based VM Java byte code运行在JVM上,就像机器指令运行在物理机上,是需要遵循这个机器的指令规范的.所以认识JVM byte code,是需要稍微了解下JVM的.JVM是一个基于栈(stack-based)的虚拟机.很久以前我还写过类似简单的虚拟机. 基于栈的虚拟机其操作数和指令运算的中间结果全部都在一个虚拟栈中,与之对应的是基于寄存器(register-b

JVM系列(一内存模型)

好久没有整理这方面的东西了.现在整理一下JVM相关的东西.这是第一篇,JVM内存模型. 进程&JVM 首先,何谓JVM?为什么要有JVM的存在? JVM就是java virtual machine的简称.当然了,除了java的VM以外还会有好多别的虚拟机.java的VM模型有好几个,其中最常见的应该是HotSpot VM. 假设jvm在一个32位的操作系统中运行.32位windows最大只支持4G内存,而进程只能最多2G内存:32位linux最大也只支持4G内存,但是进程最多可以有3G左右.画个

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

其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云.本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之间的区别,搞清楚我们写的 xxx.java 文件是被谁编译,又被谁执行,为什么能够跨平台运行. 首先,我们分别对这三者进行阐述. JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机.它只认识 xxx.class 这种类型的文件,它能够将 class

jre、jdk、jvm之间的关系

很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的. JVM(Java Virtual Machine) Java 虚拟机.它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作.所以说,JVM 是 Java 能够跨平台的核心. JRE (Java Runtime Environment) Java 运行时环境.它主要包含两个部分,JVM的标准实现和 Java 的

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴.美团.京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验,毕竟线上系统写好代码部署之后,每个工程师都必须关注JVM相关的东西,比如OOM.GC等问题. 所以一起来看看JVM的最基本的区域划分以及工作原理,这个基本上是互联网公司面试必问. 区域划分 jvm的区域划分如下所示: 大致就是分为:程序计数器,虚拟机栈,堆,方法区,本地方法栈,这几个部分. 接下来我们从自己写好的Java代码如何通过JVM来运行的角度,来分析一下JVM

【转载】Android Studio 设置内存大小及原理

http://www.cnblogs.com/justinzhang/p/4274985.html http://tsroad.lofter.com/post/376316_69363ae Android studio 1.0.2默认最大内存是750M,这样跑起来非常的卡,难以忍受,机器又不是固态硬盘,最后发现,这个默认值是可以修改的,在android studio目录下找到:studio64.exe.vmoptions文件,绿色部分为修改的参数(-Xmx1050m),将默认参数修改为1050M

JS冒泡和闭包案例分析

背景: 今天逛网页发现了百度知道上一个有意思的JS问题,提问者的问题事实上蛮简单的,懂点前端开发技术的应该都能实现.提问者的要求:实现子菜单的弹出,菜单共同拥有三级.每级菜单显示时有500毫秒的延迟.然后提问者贴出了他的问题代码. 对别人贴出来的代码.仅仅要不是特别复杂,我都会看一眼. 毕竟程序猿交流,源码是最好的语言,刚開始看他的代码就有点感觉哪里不正确. 后来细致分析了下.发现确实是蛮有意思的. 假设感觉分析过程比較无聊.能够直接看结论. 以下是他的代码: <html> <head&