1. 多线程并发访问一个静态方法(static method)会不会有什么性能影响?

  思考:不会,原因是static method编译后及时一串指令(jvm中的静态方法区,也叫non-heap(包含了Perm Gen),jvm规范对该区没有GC 要求);

     如果没有数据竞争,就不会有并发不安全的问题。

       那个数据调用了改方法,则对改数据做一系列的指令。

2.所谓的minor GC ,full GC 和常见的内存溢出,你的理解是什么?

  思考:jvm 内存模型分几大区域:栈(线程)、堆(实例)、静态方法区(class,method等),

    GC 都是发生在堆内存(heap),堆中分为一个Eden、两个survivor、一个Tunured;清空Eden叫minor GC,清空Tenured叫full GC ,suvivor完成数据的交换。

    内存溢出在可以发生在任何区域

    栈帧溢出:StackOverflowError:Thrown when a stack overflow occurs because an application recurses too deeply.(-Xss 2048K 可以调整每个线程的栈内存容量)

    堆溢出:OutOfMemoryError:Java heap space (调整参数为-Xms128m -Xmx521m)

    静态方法栈溢出:OutOfMemoryError:PermGen space (调整参数为: -XX:PermSize=256m -XX:MaxPermSize=512m)

3.关于static、final、static final修饰的变量 你有什么理解?

  static 和 final 修饰的变量:在 Perm Gen(方法区)中。

  而static final两个修饰符同时修饰的变量 并不在此区域中。

  验证代码和现象如下:

package demo;

public class Test {

    public static void main(String[] args) {
try {
Thread.sleep(10*1000);
System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10002);// 无明显变化
Thread.sleep(10*1000);
System.out.println(ConstC.str10000);//无明显变化
Thread.sleep(10*1000);
} catch (Exception e) {
e.printStackTrace();
}
} }

    

这个例子有些值得思考的地方:比如static final为何没有出现在PermGen中,我去查阅了有关资料,说static final是编译期常量,不会引发类的初始化。(http://www.cnblogs.com/jxzheng/p/5191037.html)

于是,我在test中加了一行代码:Class.forName()

  

package demo;

public class Test {

    public static void main(String[] args) {
try {
Thread.sleep(10*1000);
System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10002);// 无明显变化
Thread.sleep(10*1000);
Class.forName("demo.ConstC");
System.out.println(ConstC.str10000);//20秒后,内存开始变化
Thread.sleep(10*1000);
} catch (Exception e) {
e.printStackTrace();
}
} }

  

  

关于java和jvm的思考的更多相关文章

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

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  3. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  4. 如果你不了解Java的JVM,那真的很难进BAT一线大厂!

    前言 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试 ...

  5. java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统

    参考书籍:<深入理解java虚拟机>,三天时间用了八个小时看完,像读一本武侠小说,挺爽. 另外需声明:图片都是从我自己的csdn博客转载,所以虽然有csdn标识,但都是我自己画的图片. j ...

  6. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  7. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  8. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  9. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

随机推荐

  1. python全栈开发笔记---数据类型--综合练习题

    一.有两个列表 l1 = [11,22,33]       l2 = [22,33,44] a. 获取内容相同的元素列表 for item in l1: if item in l2: print(it ...

  2. python中字符串格式化

    username='小黑'age=18high=1.88s2='欢迎%s,年龄是%d,身高是%.2f'%(username,age,high)#%s是通用的,%d就必须传整数,%f就必须是小数,想保留 ...

  3. ssh语法高亮

    借助于ssh,使用vi/vim进行文本编辑的语法高亮显示的方法如下: 第一步:设置vi别名 在Linux中,.bashrc与.bash_profile文件为当前用户登录时所执行的,/etc/bashr ...

  4. SharePoint Framework Extensions GA Release

    博客地址:http://blog.csdn.net/FoxDave SharePoint Framework Extensions GA版本已经发布了,介于最近个人工作的变动调整,还没时间好好了解一下 ...

  5. 基于Verilog的串口发送程序

    一.模块框图及基本思路 tx_bps_module:波特率时钟产生模块 tx_control_module:串口发送的核心控制模块 tx_module:前两个模块的组合 control_module: ...

  6. 返回指针的函数 ------ 指针函数(pointer function)

    指针函数: 其本质是一个函数, 其函数返回值为某一类型的指针. 定义形式: 类型 *指针变量名(参数列表): 例如: int *p(int i,int j); p是一个函数名,该函数有2个整形参数,返 ...

  7. php之异常处理

    <?php declare(strict_types = 1); function demo(int $v):int{ return 1; } try{ demo("1"); ...

  8. 2017-2018 ACM-ICPC, NEERC A题Automatic Door 挺棘手的模拟

    题目链接:http://codeforces.com/contest/883/problem/A 题意大致就是有一个门,有n个人有规律的来,时刻分别是a,2a,3a.....na.有m个人无规律的来, ...

  9. js封装选项卡

    <div class="forestcamp_box"> <img src="img/home_02.jpg" /> <div c ...

  10. 原来bug解决了,是这样的感觉

    终于过了,感觉好想哭啊,又莫名其妙的爽,原来这就是bug