JVM组成

Java虚拟机运行时数据区域主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。
Q3:运行时数据区中哪些区域是线程共享的?哪些是独享的?
在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。
而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还未每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。(TLAB介绍
Q4:堆和栈的区别是什么?
堆和栈(虚拟机栈)是完全不同的两块内存区域,一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:
堆中主要存放对象实例。  栈(局部变量表)中主要存放各种基本数据类型、对象的引用。
Q6:Java中的数组是存储在堆上还是栈上的?
在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;
所以,数组的实例是保存在堆中,而数组的引用是保存在栈上的。
 
Q7:Java中的对象创建有多少种方式?
1 . new    2.   class.for().newInstance   3.  Constructor  4. clone 5. 序列化
 
Q8:Java中对象创建的过程是怎么样的?
对于一个普通的Java对象的创建,大致过程如下:
1、虚拟机遇到new指令,到常量池定位到这个类的符号引用。  2、检查符号引用代表的类是否被加载、解析、初始化过。  3、虚拟机为对象分配内存。  4、虚拟机将分配到的内存空间都初始化为零值。  5、虚拟机对对象进行必要的设置。  6、执行方法,成员变量进行初始化。
 
Q9:出现CPU跟内容飙升处理方式
 
首先我们通过top命令查看当前CPU消耗过高的进程是哪个,从而得到进程id;然后通过top -Hp <pid>来查看该进程中有哪些线程CPU过高,一般超过80%就是比较高的,80%左右是合理情况。这样我们就能得到CPU消耗比较高的线程id。接着通过该线程id的十六进制表示在jstack日志中查看当前线程具体的堆栈信息
posted @ 2019-10-30 09:08  爱上胡萝卜的猴子  阅读(159)  评论(0编辑  收藏  举报