sample java_从sample来学习Java堆(转)
1)Java堆
所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示:
public class HeapOOM {
static class OOMObject{}
/**
* @param args
*/
public static void main(String[] args) {
List list = new ArrayList();
while(true){
list.add(new OOMObject());
}
}
}
加上JVM参数-verbose:gc -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError,就能很快报出OOM:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
并且能自动生成Dump.
2)方法区
方法区是存放虚拟机加载类的相关信息,如类、静态变量和常量,大小由-XX:PermSize和-XX:MaxPermSize来调节,类太多有可能撑爆永久带:
public class MethodAreaOOM {
static class OOMOjbect{}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
while(true){
Enhancer eh = new Enhancer();
eh.setSuperclass(OOMOjbect.class);
eh.setUseCache(false);
eh.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object arg0, Method arg1,
Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
return arg3.invokeSuper(arg0, arg2);
}
});
eh.create();
}
}
}
加上永久带的JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后会报如下异常:
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
静态变量或常量也会有可能撑爆方法区:
public class ConstantOOM {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
int i=0;
while(true){
list.add(String.valueOf(i++)。intern());
}
}
}
同样加上JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后报如下异常:
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
3)Java栈和本地方法栈
栈是存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息,栈大小由Xss来调节,方法调用层次太多会撑爆这个区域,samples如下所示:
package com.cutesource;
public class StackOOM {
/**
* @param args
*/
private int stackLength = 1;
public void stackLeak(){
stackLength++;
stackLeak();
}
public static void main(String[] args) throws Throwable{
// TODO Auto-generated method stub
StackOOM oom = new StackOOM();
try{
oom.stackLeak();
}catch(Throwable err){
System.out.println("Stack length:" + oom.stackLength);
throw err;
}
}
}
设置JVM参数:-Xss128k,报出异常:
Exception in thread "main" java.lang.StackOverflowError
打印出Stack length:1007,这里可以看出,在我的机器上128k的栈容量能承载深度为1007的方法调用。当然报这样的错很少见,一般只会出现无限循环的递归中,另外,线程太多也会占满栈区域:
package com.cutesource;
public class StackOOM {
/**
* @param args
*/
private int stackLength = 1;
private void dontStop(){
while(true){
try{Thread.sleep(1000);}catch(Exception err){}
}
}
public void stackLeakByThread(){
while(true){
Thread t = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
dontStop();
}
});
t.start();
stackLength++;
}
}
public static void main(String[] args) throws Throwable{
// TODO Auto-generated method stub
StackOOM oom = new StackOOM();
try{
oom.stackLeakByThread();
}catch(Throwable err){
System.out.println("Stack length:" + oom.stackLength);
throw err;
}
}
}
报出异常:Exception in thread "main" java.lang.OutOfMemoryError:unable to create new native thread
不过在windows上运行这个例子要小心,会出现系统假死的情况,有可能需要重启机器才行。
以上几个例子虽然比较简单,但能很好帮助普通的程序员更加直观的了解Java堆,方法区,Java栈和本地方法栈。
sample java_从sample来学习Java堆(转)相关推荐
- 从几个sample来学习Java堆,方法区,Java栈和本地方法栈
2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...
- fitnesse java_从Fitnesse中学习Java单元测试
从第一次知道Fitnesse这个集成测试工具到现在也已经差不多有2年多的时间了.在这个期间把Fitnesse的源码也算是反反复复阅读了很多遍,算是对其实现的原理和方法有所了解.在最近一次对Fitnes ...
- 新手学java_新手如何学习Java
新手如何学习Java Java作为一门高级编程语言在信息科技时代有着广泛的应用.新手如何学习Java呢?下面小编来给大家介绍Java的学习方法,希望对大家有帮助! 1理解Java思想 Java是一门面 ...
- 怎么判断适合学java_如何知道自己是否适合学习java开发
有时候,我们都会对自己的未来进行短期和长期的规划,以期可以实现自己曾经定下来的目标.而对于一些对编程语言非常感兴趣的人来说,怎样选择一门适合自己的编程语言是最为重要的.相信程序员们对于编程语言一定不会 ...
- Math源码java_深入学习java源码之Math.sin()与 Math.sqrt()
深入学习java源码之Math.sin()与 Math.sqrt() native关键字 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这个语言来写即可.Java平台有个用户和本地C代码进行 ...
- 测试学习java_使用Junit测试框架学习Java
前言 在日常的开发中,离不开单元测试,而且在学习Java时,特别是在测试不同API使用时要不停的写main方法,显得很繁琐,所以这里介绍使用Junit学习Java的方法.此外,我使用log4j将结果输 ...
- 怎么样才能学好java_论新手该如何学习java?
由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...
- 多高学历的人能学懂java_初中学历学习java能行吗?
初中学历报培训班?你是不是被洗脑了?是你就眨眨眼 初中学历一样可以学习Java,没有哪一条规定学历低就不能学习Java 能不能找到工作取决于你的技术,还取决于你的运气,假如你头简历碰到一家不要求学历的 ...
- 如何系统的学习java_如何系统学习java
如何系统学习java Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性.下面小编收集了一些 ...
最新文章
- python aes_python AES 加密
- VTK修炼之道6_仔细分析一个复杂程序
- 【工作分解法】IT人,你的工作“轻松”么?
- VSCode配置Python编辑器
- tea 加密密钥生成_加密密钥生成需要的是熵的良好来源
- 管理感悟:回字有几种写法的面试
- 常用DB9外设接口定义
- mybatis基础(下)
- RAL 2022|基于3D语义共视图的语义SLAM精确回环检测
- du命令参数-h/-s
- 八:用MATLAB求传递函数的单位阶跃响应并绘制出曲线
- 基于Pacemaker+Corosync的PostgreSQL HA故障两例
- 2019最新抖音全方位数据分析报告
- 多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
- 做短视频时如何将文字转为语音?分享三个小方法,教你轻松配音
- 小学生学计算机,学计算机对小学生的好处
- 记一次配置rewrite和return的经历
- java饲养员喂动物_体现JAVA中的面向对象思想,接口(抽象类)的用处 :饲养员给动物喂食物...
- 原创_Android Jetpack Compose 最全上手指南,互联网寒冬公司倒闭后
- 自适应流媒体传输-fmp4
热门文章
- 月薪20k-50k| 西人马3D机器视觉算法、语音识别、DSP软件工程师招聘
- React history.push 传递参数
- LeetCode 52. N皇后 II
- J. Cheminform. | GraphSol:预测接触图助力蛋白质溶解度预测
- Python—pandas中DataFrame类型数据操作函数
- ubuntu下使用SVN
- 批量提取出apk文件中的classes.dex文件
- java timer和timertask_Timer和TimerTask与Java中的线程+睡眠
- 在线作图|如何绘制带分组的散点图
- Bioinformatics:吉林大学刘富组-深度学习从宏基因组序列中识别短病毒序列Virtifier...