• 关于

    jni+java

    的搜索结果

问题

Tomcat8正常运行一段时间后报错org.apache.tomcat.jni.Error: 730055错误,为什么?

落地花开啦 2019-12-01 19:42:35 3587 浏览量 回答数 1

回答

如果没猜错的话题主是想要对wav文件进行读取操作: package com.chinasoft.cn; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; @SuppressWarnings("unused") public class WaveFileReader { private String filename = null; private int[][] data = null; private int len = 0; private String chunkdescriptor = null; private long chunksize = 0; private String waveflag = null; private String fmtsubchunk = null; private long subchunk1size = 0; private int audioformat = 0; private int numchannels = 0; private long samplerate = 0; private long byterate = 0; private int blockalign = 0; private int bitspersample = 0; private String datasubchunk = null; private long subchunk2size = 0; private FileInputStream fis = null; private BufferedInputStream bis = null; private boolean issuccess = false; public WaveFileReader(String filename) { this.initReader(filename); } // 判断是否创建wav读取器成功 public boolean isSuccess() { return issuccess; } // 获取每个采样的编码长度,8bit或者16bit public int getBitPerSample() { return this.bitspersample; } // 获取采样率 public long getSampleRate() { return this.samplerate; } // 获取声道个数,1代表单声道 2代表立体声 public int getNumChannels() { return this.numchannels; } // 获取数据长度,也就是一共采样多少个 public int getDataLen() { return this.len; } // 获取数据 // 数据是一个二维数组,[n][m]代表第n个声道的第m个采样值 public int[][] getData() { return this.data; } private void initReader(String filename) { this.filename = filename; try { fis = new FileInputStream(this.filename); bis = new BufferedInputStream(fis); this.chunkdescriptor = readString(WaveConstants.LENCHUNKDESCRIPTOR); if (!chunkdescriptor.endsWith("RIFF")) throw new IllegalArgumentException("RIFF miss, " + filename + " is not a wave file."); this.chunksize = readLong(); this.waveflag = readString(WaveConstants.LENWAVEFLAG); if (!waveflag.endsWith("WAVE")) throw new IllegalArgumentException("WAVE miss, " + filename + " is not a wave file."); this.fmtsubchunk = readString(WaveConstants.LENFMTSUBCHUNK); if (!fmtsubchunk.endsWith("fmt ")) throw new IllegalArgumentException("fmt miss, " + filename + " is not a wave file."); this.subchunk1size = readLong(); this.audioformat = readInt(); this.numchannels = readInt(); this.samplerate = readLong(); this.byterate = readLong(); this.blockalign = readInt(); this.bitspersample = readInt(); this.datasubchunk = readString(WaveConstants.LENDATASUBCHUNK); if (!datasubchunk.endsWith("data")) throw new IllegalArgumentException("data miss, " + filename + " is not a wave file."); this.subchunk2size = readLong(); this.len = (int) (this.subchunk2size / (this.bitspersample / 8) / this.numchannels); this.data = new int[this.numchannels][this.len]; // 读取数据 for (int i = 0; i < this.len; ++i) { for (int n = 0; n < this.numchannels; ++n) { if (this.bitspersample == 8) { this.data[n][i] = bis.read(); } else if (this.bitspersample == 16) { this.data[n][i] = this.readInt(); } } } issuccess = true; } catch (Exception e) { e.printStackTrace(); } finally { try { if (bis != null) bis.close(); if (fis != null) fis.close(); } catch (Exception e1) { e1.printStackTrace(); } } } private String readString(int len) { byte[] buf = new byte[len]; try { if (bis.read(buf) != len) throw new IOException("no more data!!!"); } catch (IOException e) { e.printStackTrace(); } return new String(buf); } private int readInt() { byte[] buf = new byte[2]; int res = 0; try { if (bis.read(buf) != 2) throw new IOException("no more data!!!"); res = (buf[0] & 0x000000FF) | (((int) buf[1]) << 8); } catch (IOException e) { e.printStackTrace(); } return res; } private long readLong() { long res = 0; try { long[] l = new long[4]; for (int i = 0; i < 4; ++i) { l[i] = bis.read(); if (l[i] == -1) { throw new IOException("no more data!!!"); } } res = l[0] | (l[1] << 8) | (l[2] << 16) | (l[3] << 24); } catch (IOException e) { e.printStackTrace(); } return res; } private byte[] readBytes(int len) { byte[] buf = new byte[len]; try { if (bis.read(buf) != len) throw new IOException("no more data!!!"); } catch (IOException e) { e.printStackTrace(); } return buf; } public static int[] readSingleChannel(String filename) { if (filename == null || filename.length() == 0) { return null; } try { WaveFileReader reader = new WaveFileReader(filename); int[] res = reader.getData()[0]; return res; } catch (Exception e) { e.printStackTrace(); } return null; } } 第二个问题,java虽然没有无符号数,但是不管有无符号,对于二进制数据来说,在内存里存储的值是一样的,只不过打印出来时显示的值不一样,同时在做逻辑对比时有符号和无符号,虽然存储的值一样,但是“大小”可能不同。顺便说一下,如果你感觉java确实不熟,可以尝试一下JNI。

蛮大人123 2019-12-02 01:54:16 0 浏览量 回答数 0

回答

一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发。 使用了 api和jni; 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式; n,8,1,没得选; 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进行定时刷新; 发送区的数据以及一些设置项,在程序关闭时会自动保存,打开时自动载入; jni使用最新的NDKr8b重新编译了一下 简单编写步骤: 1.新建一个项目,自己起个名字 2.直接复制serialport api和jni文件夹到新建的工程,如果不想自己编译jni,就连libs文件夹也一起复制 3.去android官方网站下载NDK,解压,在CMD中转到jni目录,并执行 绝对路径ndk-build 4.自己再封装一个工具类或直接使用SerialPort类都行,举个直接使用的例: 直接剽窃原项目的SerialPortActivity.java,并稍微改一下,重点改这里 mSerialPort = mApplication.getSerialPort(); 这里可以改成 new SerialPort(new File("/dev/s3c2410_serial0"), 9600, 0);//COM0,波特率9600 SerialPortFinder的使用就没什么好讲的了,实例化后用.getAllDevicesPath()就能获取到所有设备了。其它如数据转换等请参考源码 源码可以参考谷歌android-serialport-api例子 二,串口通信协议解析 1.通信基本格式 字段 描述 长度(字节) 起始符 0F,十六进制码 1 信息类型 一个字节,十六进制码(0F,F0,FF等保留码不用)1 信息长度 是信息内容的长度,ASCII码表示(0~9,A~F,最大长度为256)(例如长为11个,十六进制是0B,则两个字节就写0x30 0x42)。 注:因为最大长度256不能满足有些指令的要求,所以对长度做了扩展,下面是扩展说明: 如果第一个字节的最高位为1,则表示扩展长度。在扩展长度状态下,其他15个字节通过16进制大端模式来保存长度。比如:0x80 0x12表示长度为0x001 2,0x81 0x12表示长度为0x0112。2 信息内容 一组十六进制码 N 校验 一个字节,十六进制码,是自信息类型起至对象号止所有码的异或。1 结束符 F0,一个字节,十六进制码 (为了保证可靠性,车机下发的结束符为F0 FF)1 2.协议解析 /** * 读取终端设备数据 * @author Administrator */ private class ReadThread extends Thread { @Override public void run() { super.run(); // 定义一个包的最大长度 int maxLength = 2048; byte[] buffer = new byte[maxLength]; // 每次收到实际长度 int available = 0; // 当前已经收到包的总长度 int currentLength = 0; // 协议头长度4个字节(开始符1,类型1,长度2) int headerLength = 4; while (!isInterrupted()) { try { available = mInputStream.available(); if (available > 0) { // 防止超出数组最大长度导致溢出 if (available > maxLength - currentLength) { available = maxLength - currentLength; } mInputStream.read(buffer, currentLength, available); currentLength += available; } } catch (Exception e) { e.printStackTrace(); } int cursor = 0; // 如果当前收到包大于头的长度,则解析当前包 while (currentLength >= headerLength) { // 取到头部第一个字节 if (buffer[cursor] != 0x0F) { --currentLength; ++cursor; continue; } int contentLenght = parseLen(buffer, cursor, headerLength); // 如果内容包的长度大于最大内容长度或者小于等于0,则说明这个包有问题,丢弃 if (contentLenght <= 0 || contentLenght > maxLength - 5) { currentLength = 0; break; } // 如果当前获取到长度小于整个包的长度,则跳出循环等待继续接收数据 int factPackLen = contentLenght + 5; if (currentLength < contentLenght + 5) { break; } // 一个完整包即产生 // proceOnePacket(buffer,i,factPackLen); onDataReceived(buffer, cursor, factPackLen); currentLength -= factPackLen; cursor += factPackLen; } // 残留字节移到缓冲区首 if (currentLength > 0 && cursor > 0) { System.arraycopy(buffer, cursor, buffer, 0, currentLength); } } } } /** * 获取协议内容长度 * @param header * @return */ public int parseLen(byte buffer[], int index, int headerLength) { // if (buffer.length - index < headerLength) { return 0; } byte a = buffer[index + 2]; byte b = buffer[index + 3]; int rlt = 0; if (((a >> 7) & 0x1) == 0x1) { rlt = (((a & 0x7f) << 8) | b); } else { char[] tmp = new char[2]; tmp[0] = (char) a; tmp[1] = (char) b; String s = new String(tmp, 0, 2); rlt = Integer.parseInt(s, 16); } return rlt; } protected void onDataReceived(final byte[] buffer, final int index, final int packlen) { System.out.println("收到信息"); byte[] buf = new byte[packlen]; System.arraycopy(buffer, index, buf, 0, packlen); ProtocolAnalyze.getInstance(myHandler).analyze(buf); }

爵霸 2019-12-02 01:56:32 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

Linux环境下java识别so中的方法

爵霸 2019-12-01 19:23:00 1072 浏览量 回答数 1

问题

Python框架可替代“ Java + OSGi”

祖安文状元 2020-02-21 14:24:04 1 浏览量 回答数 1

回答

作为一个软件工程专业的过来人,希望我的回答能够帮助你,假设你每天坚持学习 首先找一本简单的教材,先对java有个基本的认识(大概看那么半个月就差不多了,随便下载一本入门的书就行了) 然后推荐你看<<java核心技术>>,分为上下两卷,已经是第八版了,大概有一千六七百页;当 你看完后,基本的java知识已经掌握了(记住,一定要多练习啊)(我那时候一个暑假看完第一遍,每天看将近十个小时加练习,但是要弄懂,呵呵,至少看个三四遍吧,这两本书只要能搞懂70%就很不错了) 这个时候你可以看看<<thinking in java>>中文名"java编程思想",这本书写的比较难,如果你看不懂,那么你要多做练习,慢慢看,如果看完了,而且懂了,那么证明你的java水平到达了一个更高的层次;(去参加面试的时候问的那些java知识完全可以应付过来了)(或者你可以先看下面的书,边看thinking in java这本书,这样也是可以的,而且学习的效率应该会高些) 然后java就会分方向,j2me(手机编程)不建议你去学这个(要学就学android手机编程),已经过时了;j2ee方向(Web编程),先学html,javaScript,css(这些书多得数不清,呵呵),然后就学servlet和jsp,《jsp应用开发详解》(入门) 《Servlet与JSP核心编程》(核心)这两本书还不错,然后就可以学SSH(三大框架,这个书一大堆), 学习struts的时候建议你从struts1开始学起《精通Struts基于MVC的Java Web设计与开发》,然后就可以学习struts2《Struts2权威指南》,接下来学习Hibernate《精通Hibernate:Java对象持久化技术详解》,最后学习Spring《spring2.0技术手册》(提示:只要你java基础学得好,这些东西都会学得很快) 这个时候你就要把注意力放在设计模式,数据结构和计算机算法上面来了, 设计模式可以先看<<深入浅出设计模式>> 然后再看<<java与模式>>, 数据结构建议你看清华大学严慰敏老师写的那本教材; 计算机算法要了解基本的排序,如果你不做底层,只做应用的话,没有必要去看那个<<算法导论>这本书太难了。 (设计模式,数据结构和算法才是真正的精髓,要有很多年的编程经验才能够使用得游刃有余,光看懂还不行的,一定要多练习,到了这个境界才是真正的java高手)(我学java有三年了,这是我的体会) 等你掌握前面的这些知识之后,推荐你看<<effective java>>,这本书是目前java领域公认的高级书籍。在项目中你肯定会遇到一些前端的知识,那么你得精通javascript,<<JavaScript权威指南>>(入门), <<JavaScript高级程序设计>>(进阶),这两本书弄懂了,那么学习jquery和extjs都会很快的。 还有要提醒你一下,对于初学者,不要使用eclipse编程工具,建议你先用记事本写程序,当你比较熟练了之后就可以使用eclipse这些工具了。 不要心急,不要图快,所有的书要一本本的慢慢看,多看几遍(一本书看上个四五遍,你就可以成高手,呵呵)。 java基础(j2se)的重点有:继承、多态、流、线程、网络编程、反射、集合、数据库连接、泛型、JNI技术、分布式技术还有解析xml也是很重要的,如果你想学android手机编程,那么SWING和AWT要熟悉一下。如果你不想学Web编程(j2ee),那么我建议你可以学android手机编程《Google+Android开发入门与实战》(入门) 《Google Android SDK开发范例大全》(深入)(建议把android当作业余爱好,把web编程当作主攻方向,因为j2ee包含了大量框架知识),书很多,可以自己去搜。多想 多看 多练才是王道,不要相信什么培训机构,这些都没啥用,真正学好只能靠你自己。 面向对象思想+java基础(j2se)+数据结构+设计模式+计算机算法 为核心,学好了这几个8000元/月轻而易举,什么都可以不学好,唯独这几科一定要学好,切记切记。 当然,随着你的技术水平的提高,你还会要学习其他的语言,不过这都是后话,等你把上面的东西掌握了,我再告诉你怎么学(高并发等内容),哈哈。 你现在还是在校的学生,那么请记住,不要沉迷于游戏,把时间用于学习上面的知识,千万别听一些人说什么'学校学的东西工作都用不到',完全是胡扯,我很负责任的告诉你,只有学校里学的东西才是真正有技术含量的东西,真正工作了,你就没有那么多时间来学习了(唉,感触很深呐) 以上的内容是我学习的总结,当然我走过很多弯路,现在我把这条正确的路径介绍给你,也是希望你能够少走弯路,希望几年之后,你能够比现在的我更牛X(呵呵,吹个小牛)。加油。参考资料来源:http://zhidao.baidu.com/question/404215211.html

晚来风急 2019-12-02 01:20:25 0 浏览量 回答数 0

回答

(1) jvm可以理解为一个由c++所编写的内存容器:包含了加载器,编译器等。当然了,我当时最困惑的就是class是怎么被执行的Java中的对象模型:OOP-Klass模型OOP:普通对象指针,Kcass:java类在c++中的对等体Kclass想jvm提供的功能:实现语言层面的java类实现java对象的派发 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(2) 根据以上所述,是不是明白了些什么呢,关于java的执行器:对于任意一门语言,如果不能被编译陈本机的可执行指令,则根本无法运行。众所周知,java编译器会将.java的文件编译成.class的文件而.class文件在物理机上是无法执行的,所以才有了(1)中对等层的概念。java的编译器分为:模板解析器,c++编译器 最终生产的都是机器码(别怀疑,就是这么做的)还有一种最老的是字节码解析器---->为什么现在不用了不知道原因的说 关于热点代码的问题:在jvm执行期间,会将一些循环的代码,经常用到的代码标记为热点----->那什么是热点呢,热点是怎么运行的呢热点代码,会被编译成本地的机器码。在执行期间,会有一个转发表,而热点代码相关的部分会与提前生成的机器码相关联----->提高运行速度 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(3)java的整个执行流程:.java--->.class--->类加载(aop[asm,gcb等],安全验证[为什么说java比较安全呢],连接[在解码中的符号引用])---->生成对等体---->动态编译---->执行执行(方法去,堆,栈)。 java的所有的一切都是在内存中进行的,这也是与c/c+不同的:对于c/c++等写的程序,会直接编译生成机器代码,而java的机器代码是动态生成的,换句话说 java将编译的过程委托给了虚拟机动态执行 (4) java的JNIJNI即:java本地方法,在jvm想执行class中的方法是,是通过jni才jvm的内存中进行查找,在执行。对于java中的方法,对象等概念,都统一理解为jvm的运行时数据就可以了。 (5)为什么要分方法区,常量区,堆,栈呢个人感觉 :程序就是数据结构+方法 在jvm的角度,这些都是给你的运行资源,进行GC等

小旋风柴进 2019-12-02 02:14:06 0 浏览量 回答数 0

问题

当在Docker容器中运行时,高I / O Java进程始终在JavaThread中获得信号11 SIGSEGV

k8s小能手 2019-12-01 19:30:31 542 浏览量 回答数 1

回答

java 代码: package com.zhanghui.test; import java.io.IOException; import java.util.Arrays; import com.xqh.util.AppLog; import android.annotation.TargetApi; import android.app.Activity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; @SuppressWarnings("deprecation") public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private Button mTakeButton; private Button mPlayButton; private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private boolean isRecording = false; private int i = 0; private class StreamTask extends AsyncTask<Void, Void, Void> { private byte[] mData; // 构造函数 StreamTask(byte[] data) { this.mData = data; } @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub if (mData != null) { Log.i(">>>" , Arrays.toString(mData)); encode(mData); } return null; } } private StreamTask mStreamTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Camera.PreviewCallback mPreviewCallbacx = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] arg0, Camera arg1) { // TODO Auto-generated method stub if (null != mStreamTask) { switch (mStreamTask.getStatus()) { case RUNNING: return; case PENDING: mStreamTask.cancel(false); break; default: break; } } // if(arg0 != null ){ // for (int i = 0; i < arg0.length; i++) { // Log.e(">>>", arg0[i]+""); // } // } util.e(">>", Arrays.toString(arg0)); encode(arg0); // mStreamTask = new StreamTask(arg0); // mStreamTask.execute((Void) null); } }; mTakeButton = (Button) findViewById(R.id.take_button); mPlayButton = (Button) findViewById(R.id.play_button); PackageManager pm = this.getPackageManager(); boolean hasCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) || pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) || Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD; if (!hasCamera) mTakeButton.setEnabled(false); mTakeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (mCamera != null) { if (isRecording) { mTakeButton.setText("Start"); mCamera.setPreviewCallback(null); Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show(); isRecording = false; } else { mTakeButton.setText("Stop"); initial(mCamera.getParameters().getPreviewSize().width, mCamera.getParameters().getPreviewSize().height); // stream("rtmp://192.168.2.176/live/livestream"); mCamera.setPreviewCallback(mPreviewCallbacx); isRecording = true; } } } }); mPlayButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { String folderurl = Environment.getExternalStorageDirectory() .getPath(); String inputurl = folderurl + "/" + "aa.flv"; // stream("rtmp://192.168.2.176/live/livestream"); } }); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1); SurfaceHolder holder = mSurfaceView.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub if (mCamera != null) { mCamera.stopPreview(); mSurfaceView = null; mSurfaceHolder = null; } } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub try { if (mCamera != null) { mCamera.setPreviewDisplay(arg0); mSurfaceHolder = arg0; } } catch (IOException exception) { Log.e(TAG, "Error setting up preview display", exception); } } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub if (mCamera == null) return; Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(640, 480); parameters.setPictureSize(640, 480); mCamera.setParameters(parameters); try { mCamera.startPreview(); mSurfaceHolder = arg0; } catch (Exception e) { Log.e(TAG, "could not start preview", e); mCamera.release(); mCamera = null; } } }); } @TargetApi(9) @Override protected void onResume() { super.onResume(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { mCamera = Camera.open(0); } else { mCamera = Camera.open(); } } @Override protected void onPause() { super.onPause(); flush(); close(); if (mCamera != null) { mCamera.release(); mCamera = null; } } // JNI public native int initial(int width, int height); public native int encode(byte[] yuvimage); public native int flush(); public native int close(); // JNI // public native int stream(String outputurl); static { System.loadLibrary("avutil-54"); System.loadLibrary("swresample-1"); System.loadLibrary("avcodec-56"); System.loadLibrary("avformat-56"); System.loadLibrary("swscale-3"); System.loadLibrary("postproc-53"); System.loadLibrary("avfilter-5"); System.loadLibrary("avdevice-56"); System.loadLibrary("encode"); } }

爵霸 2019-12-02 01:56:23 0 浏览量 回答数 0

回答

第一种OutOfMemoryError: PermGen space发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行: JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m" 如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。第二种OutOfMemoryError: Java heap space发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。 我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m第三种OutOfMemoryError:unable to create new native thread在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。那么是什么原因造成这种问题呢?每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。给出一个有关能够创建线程的最大个数的估算公式:(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads对于jdk1.5而言,假设操作系统保留120M内存:1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads对于栈大小为256KB的jdk1.4而言,1.5GB allocated to JVM: ~1520 threads1.0GB allocated to JVM: ~3520 threads 对于这个异常我们首先需要判断下,发生内存溢出时进程中到底都有什么样的线程,这些线程是否是应该存在的,是否可以通过优化来降低线程数; 另外一方面默认情况下java为每个线程分配的栈内存大小是1M,通常情况下,这1M的栈内存空间是足足够用了,因为在通常在栈上存放的只是基础类型的数据或者对象的引用,这些东西都不会占据太大的内存, 我们可以通过调整jvm参数,降低为每个线程分配的栈内存大小来解决问题,例如在jvm参数中添加-Xss128k将线程栈内存大小设置为128k。

蛮大人123 2019-12-02 02:27:59 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板