2.程序计数器 是指当前线程所执行字节码的行号指示器 比如if 循环 抛异常 等都需要程序计数器
如果线程执行java方法 程序计数器记录的是虚拟机字节码指令的地址 如果线程执行native方法时程序计数器记录的值为空 程序计数器是java虚拟机唯一一个没有规定内存溢出的区域
3.虚拟机栈和本地方法栈 虚拟机栈主要是为虚拟机执行的java方法服务 本地方法栈主要是未虚拟机使用的native方法服务
4.GC的分代收集算法 分为年轻代和老年代 年轻代才有复制算法 eden from to
当eden区满了 会启动年轻代的垃圾回收将还在被引用的对象复制到from 如果edan再次满了
form区会将还在被引用的对象复制到to from和to是一个循环复制 当from和to都满了则复制到
老年代区去 采用的标记清理和标记整理算法 老年代内存满了 则进行大扫除 FUll GC
FUll GC过多会影响到系统性能 合理分配年轻代和老年代的内存大小 尽量减少FUll GC操作
根据不同场景 选择合适的垃圾收集器
5.堆 是被所有线程共享的内存区域 java虚拟机启动时创建 主要存储对象实例 也是垃圾收集器
管理的重要内存区域 方法区是存储已被虚拟机加载的类信息 很少会被垃圾回收 一般收集常量池和
对类型的卸载
6.引用方式二种 使用句柄 和使用直接指针
使用句柄 存储了稳定的句柄地址 对象被移动了 只会改变句柄中实例数据的指针 reference本身不需要修改
使用直接指针 减少了一次指针定位的时间开销 提高效率
7.如果建立过多的线程导致栈溢出 可以通过减少堆内存和减少每个线程分配的栈容量增加线程数
8.怎么判断对象是否存活 不是用引用计数算法(对于对象相互引用的情况不可行) 用根搜索算法
当GC roots 到对象不可达的时候代表就可以回收了
9.对象的finalize方法只会被系统调用一次
10.方法区的无用类的判断
第一 该类的所有实例都被回收了 也就是堆中不存在该类的任何实例对象
第二 该类的加载器ClassLoader已经被回收了
第三 该类的java.lang.Class 不在任何地方引用 任何地方不存在反射引用该类的方法
11.可以设定进入老年代的对象最大年龄阀值 max 对象每经过一次Minor GC 对象年龄加一
对象年龄超过阀值则就进入老年代 或者是 survivor区当相同年龄的对象内存在survivor区内存的一半则将等于或者大于这个年龄的进入老年代
12.java自带一些命令和工具查看java虚拟机内存使用情况
jps命令 获取到虚拟机的进程号pid
jinfo命令 获取到java虚拟机信息
jstat命令 获取到java虚拟机统计信息监控工具 就是堆栈和永久代等的使用情况
jmap命令 获取到java虚拟机 堆内存的使用情况 比如新生代和老年代
jstack命令 获取到java虚拟机栈内存的使用情况
13.内存管理工具 jconsole和VisualVM(多合一故障处理工具)
jconsole启动jdk中bing中jconsole.exe可执行文件就可以使用
VisualVM需要安装插件
14.正向代理和反向代理 正向代理 客户端和代理在同一网 反向代理 代理和服务器在同一个网
15.Serial收集器和CMS收集器 收集器不是万能需要更加具体的情景采用不同的收集器
Serial收集器采用的单线程执行 停止其他的工作 只执行垃圾收集
ParNew收集器采用的多线程执行 停止其他的工作 和Serial类似 就是可以多线程执行
CMS收集器采用的和工作线程并发执行垃圾收集 低停顿 解决GC停顿时间长的问题
G1收集器是在CMS收集器上的优化 可以控制停顿时间
Paralel Scavenge收集器控制吞吐量
一般新生代采用Serial和ParNew收集器 老年代采用CMS收集器
16.有11G垃圾而且还有大对象 导致服务器每隔十几分钟停顿十几秒 怎么解决呢
服务器采用6个32位JDK的逻辑集群 每个进程分配2G 总共12G 建立一个Apache服务作为前端
均衡代理访问门户
17.JBossCache 和 MemCached 分布式缓存架构
JBossCache采用的每个集群服务器都有公共的缓存 这样相当于一个服务器的缓存需要同步其他的服务器的缓存 代价大
MemCached采用的互不通讯的方式 有一个公共的服务器管理所有集群服务器的缓存
18.堆 虚拟机栈和本地方法栈(线程死锁和直接内存) 进程(Runtime.getRuntime().exec())
19.生产者和消费者模式解决不断创建线程导致的jvm内存不足还一直重启的问题
20.类在虚拟机的整个生命周期 加载 验证 准备 解析 初始化 使用 卸载
21.tomcat如何规划用的类库和加载器? (双亲委派模型 启动类加载器 扩展类加载器 应用程序加载器 用户自定义加载器)
common/ tomcat和所有的web应用程序共同使用 common类加载器
server/ tomcat使用 所有的web应用程序不能使用 catalina加载器
shared/ tomcat不能使用 所有的web应用程序使用 shared加载器
WEB-INF/ 当前应用程序使用 其他应用程序和tomcat不能使用 webApp加载
22.javac编译器是将java文件编译成字节码的class文件 加载器则是将将字节码的class文件加载到JVM上 动态代理模式采用生成字节码的方式实现
23.类加载器原则:委托 单一 可见性
委托:application加载器委托给Extention加载器 Extention加载器再委托给Boostsrap加载器(再向下寻找)
可见性 父类的加载的类子类可见 子类的加载的类父类不可见
单一性 父类加载的类 子类不能重复加载
24.java泛型相比C语言的泛型定义是不一致的 java的泛型可以说是伪泛型
java泛型实现原理 采用Object 进行强制类型转换 在编译是存储的是泛型T 所以会出现不同的泛型的List集合做为单参无法重载 在运行时进行强制类型转换 缺点是容易出现ClassCastException异常
25.java虚拟机采用基于计数的热点探测 检查线程的栈顶经常出现的代码 统计热点代码
26.线程安全的volatile修改的变量 被一个线程修改了会被及时刷新到变量中被其他线程可见
synchronized lock
27.锁优化方案 锁加粗 消除锁 偏向锁 轻量级锁 自旋锁和自适应锁 提高因为加锁的降低的效率

java虚拟机精讲的更多相关文章

  1. java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱

    java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱 redis数据库 Redis企业集群高级应用精品教程[图灵学院] Redis权威指南 利用redis + lua解决抢红包高并 ...

  2. 【设计模式】Java设计模式精讲之原型模式

    简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...

  3. Java设计模式精讲之UML急速入门

    简单记录 - 慕课网 - Java设计模式精讲 Debug方式+内存分析 文章目录 第2章 UML急速入门 2-1.UML简单入门 UML定义 UML特点 UML 2.2分类 UML类图 理解泛化.实 ...

  4. 8千字干货教程|java反射精讲

    java反射机制精讲 目录 1. 反射机制的概念 2. 反射的基础Class类 3. 反射的用法 4. 反射的应用示例 作者简介:全栈学习笔记,一个正在努力的人 微信公众号:公众号日更,精彩美文每天推 ...

  5. Java虚拟机1:什么是Java

    前言 让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/: 97%的企业桌面运行Java 美国有89%的桌面(或计算机)运行Java 全球有900万J ...

  6. 【深入Java虚拟机】二 类加载与双亲委派

    https://blog.csdn.net/zhangliangzi/article/details/51338291  -参考 双亲委派过程:当一个类加载器收到类加载任务时,立即将任务委派给它的父类 ...

  7. Java虚拟机规范----JVM体系结构

    一.Java平台的结构图 二.JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE:Java Runtime En ...

  8. Java虚拟机1:开篇

    1.前言 由于后期学习需要用到大量的JVM底层的东西,所有本人调整了一下学习计划,打算先从JVM入手,了解整个JAVA的运行机制,内存模型,编译原理等等一些底层的东西,这样在学习 后面的东西,会有一种 ...

  9. Java虚拟机(JVM)你只要看这一篇就够了!

    1. Java 内存区域与内存溢出异常 1.1 运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存如下图所示. 1.1.1 程序计数器 ...

随机推荐

  1. 识别C++编译器编译标准

    cout << __cplusplus<<endl; C++03:__cplusplus = 199711L C++11:__cplusplus = 201103L

  2. LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)

    题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  3. 修改PostgreSQL数据库的默认用户postgres的密码 并新建用户

    1.忘记了postgresql 安装时默认用户postgres 的密码,怎么办呢? linux shell命令下面输入: sudo -u postgres psql  (这样就可以直接登录进postg ...

  4. 发送http请求和https请求的工具类

    package com.haiyisoft.cAssistant.utils; import java.io.IOException;import java.util.ArrayList; impor ...

  5. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_6 响应json数据之过滤静态资源

    先搭建环境 webapp目录下创建js的文件夹.然后里面引入jquery.min.js这个文件. 页面引入这个js文件 先alert弹窗做测试 服务器重新部署 点击ajax的按钮 并没有起作用 我们在 ...

  6. mingw32-gcc-9.2.1-i686-posix-sjlj-20190904-8ba5c53

    gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=d:/msys/mingw32/bin/../libexec/gcc/ ...

  7. Django使用消息提示简单的弹出个对话框

    1.下面就来介绍一下如何简单的显示一个消息提示,好像js可以控制,不过这里用了django.contrib.messages这个库 2.首先呢,在项目的settings.py有默认配置一个django ...

  8. Python的Multiprocessing多进程实例

    最近在拜读RBG大神的faster-rcnn源码时发现他用了多进程去分阶段处理神经网络,原因如下: # ------------------------------------------------ ...

  9. java:svn

    1.配置: 在windows系统中,操作svn的工具最长用的是小乌龟svn 服务器端(项目所在的服务器上):在java开发中几乎所有的服务器为Linux系统 需要在Linux系统中进行安装 1.修改h ...

  10. 基于OpenCV的循环行、列移动函数circShift()

    ///*12 在Matlab中有个circShift()函数,可以实现行.列的循环移动 /// 在返卷积运算中,会用到这个函数.所以,在Opencv中我也定义同样 /// 功能的函数 /// 该函数有 ...